Kotlin为lambda生成内部类

在我的代码中,我有这样的东西:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) presenter.onCreate() fabContainer.onClick { presenter.onLoginButtonClicked(...) } } 

当我反编译apk和检查byteCode,这样的事情出现:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.presenter.onCreate(); Sdk23ListenersKt.onClick((ProgressFloatingActionButton) _$_findCachedViewById(com.prozis.prozisgo.prozisgo.R.id.fabContainer), new ActAuthLogin$onCreate$1(this)); } final class ActAuthLogin$onCreate$1 extends Lambda implements Function1 { final /* synthetic */ ActAuthLogin this$0; ActAuthLogin$onCreate$1(ActAuthLogin actAuthLogin) { this.this$0 = actAuthLogin; super(1); } public final void invoke(View it) { this.this$0.getPresenter().onLoginButtonClicked(StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.email)).getText()).toString(), StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.password)).getText()).toString(), ((CheckBox) this.this$0._$_findCachedViewById(R.id.rememberEmail)).isChecked()); } } 

为什么这个class级创建,我该如何避免? 这是正常的Kotlin字节代码,我认为lambdas已经解决了它们被调用的类中的静态方法。

如果lambda没有引用周围上下文中的任何内容,则会将其编译为静态方法。

在您的示例中,您引用presenter ,这是活动类的实例字段。 为了捕获onClick处理程序中的引用,需要创建一个新类的实例(在这种情况下,Kotlin捕获活动类的引用并通过其属性访问演示者)。

没有办法避免在这里创建一个额外的类,无论是用Kotlin还是用普通的Java。