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<View, Unit> { 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()); } }
为什么这个班级创建,我该如何避免? 这是正常的Kotlin字节代码,我认为lambdas已经解决了它们被调用的类中的静态方法。
如果lambda没有引用周围上下文中的任何内容,则会将其编译为静态方法。
在您的示例中,您引用presenter
,这是活动类的实例字段。 为了捕获onClick
处理程序中的引用,需要创建一个新类的实例(在这种情况下,Kotlin捕获活动类的引用并通过其属性访问演示者)。
没有办法避免在这里创建一个额外的类,无论是用Kotlin还是用普通的Java。
- 错误:Jack需要支持Java 8语言功能。 启用插件或删除sourceCompatibility JavaVersion.VERSION_1_8
- 使用Kotlin的数字操作是否像Java原语一样快?