Kotlin-作为尾随Lambda的接口

时间:2019-12-30 19:53:18

标签: java kotlin lambda interface

哪些规则可使接口能够用作跟踪lambda 参数?

尽管我唯一的规则是对其定义具有唯一的功能,但是我陷入了以下问题:

我有这个 Java 接口

public interface ToolbarFragmentCallBack {
    void onNavigationClick();
}

从java类调用:

public void addToolBar(int container, String title, boolean isParent,
                       ToolbarFragment.ToolbarFragmentCallBack callback) {
      //do something
}

从Kotlin和Java文件中调用了哪个

科特琳(1):

addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
            presenter.onClickNavigationToolBar()
}

Java(2):

addToolBar(R.id.toolbar_fragment, definition.getTitle(), false, () -> {
            activity.onBackPressed();
        });

但是,我最近将界面迁移到了Kotlin:

interface ToolbarFragmentCallBack {
    fun onNavigationClick()
}

现在** Kotlin(1)**实现调用无法编译,并显示消息

  

类型不匹配:推断的类型为()->单位,但   ToolbarFragment.ToolbarFragmentCallBack!是预期的

1 个答案:

答案 0 :(得分:2)

Kotlin目前仅支持Java接口的SAM转换 (请参阅docs):

  

还请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。

但是,新版本1.4(请参见What to Expect in Kotlin 1.4)将对此进行更改:

  

社区已要求我们引入对Kotlin类的SAM转换的支持。 [...] SAM转换当前仅适用于Java接口和抽象类。该设计背后的最初想法是针对此类用例明确使用函数类型。但是事实证明,函数类型和类型别名不能涵盖所有用例,人们常常不得不仅在Java中保留接口才能对其进行SAM转换。