哪些规则可使接口能够用作跟踪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!是预期的
答案 0 :(得分:2)
Kotlin目前仅支持Java接口的SAM转换 (请参阅docs):
还请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。
但是,新版本1.4(请参见What to Expect in Kotlin 1.4)将对此进行更改:
社区已要求我们引入对Kotlin类的SAM转换的支持。 [...] SAM转换当前仅适用于Java接口和抽象类。该设计背后的最初想法是针对此类用例明确使用函数类型。但是事实证明,函数类型和类型别名不能涵盖所有用例,人们常常不得不仅在Java中保留接口才能对其进行SAM转换。