Kotlin 为 lambda 生成内部 class

Kotlin generates inner class for lambda

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

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        presenter.onCreate()

        fabContainer.onClick {
            presenter.onLoginButtonClicked(...)
        }
    }

当我反编译apk并检查字节码时,出现了这样的东西:

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(this));
    }

final class ActAuthLogin$onCreate extends Lambda implements Function1<View, Unit> {
    final /* synthetic */ ActAuthLogin this[=12=];

    ActAuthLogin$onCreate(ActAuthLogin actAuthLogin) {
        this.this[=12=] = actAuthLogin;
        super(1);
    }

    public final void invoke(View it) {
        this.this[=12=].getPresenter().onLoginButtonClicked(StringsKt__StringsKt.trim(((EditText) this.this[=12=]._$_findCachedViewById(R.id.email)).getText()).toString(), StringsKt__StringsKt.trim(((EditText) this.this[=12=]._$_findCachedViewById(R.id.password)).getText()).toString(), ((CheckBox) this.this[=12=]._$_findCachedViewById(R.id.rememberEmail)).isChecked());
    }
}

为什么要创建这个 class,我该如何避免?这是正常的 Kotlin 字节码吗,我认为 lambda 被解析为 class 中的静态方法,它们被调用。

如果 lambda 不引用周围上下文中的任何内容,它就会被编译为静态方法。

在您的示例中,您引用了 presenter,它是 activity class 的实例字段。为了在 onClick 处理程序中捕获该引用,有必要创建一个新的 class 的实例(在这种情况下,Kotlin 捕获对 activity class 的引用并通过其 属性).

访问演示者

这里无法避免创建额外的 class,无论是使用 Kotlin 还是使用普通 Java。