Java Kotlin-作为后续lambda的接口
哪些规则使接口能够用作后续lambda参数 我认为唯一的规则是它在定义上有一个独特的功能,但是我陷入了以下问题: 我有一个Java接口Java Kotlin-作为后续lambda的接口,java,kotlin,lambda,interface,Java,Kotlin,Lambda,Interface,哪些规则使接口能够用作后续lambda参数 我认为唯一的规则是它在定义上有一个独特的功能,但是我陷入了以下问题: 我有一个Java接口 public interface ToolbarFragmentCallBack { void onNavigationClick(); } 从java类调用: public void addToolBar(int container, String title, boolean isParent, Too
public interface ToolbarFragmentCallBack {
void onNavigationClick();
}
从java类调用:
public void addToolBar(int container, String title, boolean isParent,
ToolbarFragment.ToolbarFragmentCallBack callback) {
//do something
}
从Kotlin和Java文件调用:
Kotlin(1):
addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
presenter.onClickNavigationToolBar()
}
addToolBar(R.id.toolbar_fragment, definition.getTitle(), false, () -> {
activity.onBackPressed();
});
Java(2):
addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
presenter.onClickNavigationToolBar()
}
addToolBar(R.id.toolbar_fragment, definition.getTitle(), false, () -> {
activity.onBackPressed();
});
但是,我最近将接口迁移到Kotlin:
interface ToolbarFragmentCallBack {
fun onNavigationClick()
}
现在**Kotlin(1)**实现调用不编译,带有消息
类型不匹配:推断的类型为()->单位,但
ToolbarFragment.ToolbarFragmentCallBack!预料之中
编辑:
现在可以使用Kotlin 1.4
但是,请注意,SAM转换仍然无法与标准接口一起工作,您必须将接口显式声明为:
fun界面工具栏片段回调{
趣味onNavigationClick()
}
addToolBar(R.id.toolbar\u片段、toolbarTitle、toolbarParent){
presenter.onClickNavigationToolBar()
}
旧答案: 目前,Kotlin仅支持Java接口的SAM转换 (见): 还请注意,此功能仅适用于Java互操作;由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持 但是,新版本1.4即将改变这一点(请参阅): 社区要求我们为Kotlin类引入SAM转换支持。[…]SAM转换目前仅适用于Java接口和抽象类。这种设计背后的最初想法是为这种用例显式地使用函数类型。然而,事实证明,函数类型和类型别名并不能覆盖所有的用例,人们常常不得不在Java中保留一个接口,只是为了得到SAM转换 编辑: 现在可以使用Kotlin 1.4 但是,请注意,SAM转换仍然无法与标准接口一起工作,您必须将接口显式声明为:
fun界面工具栏片段回调{
趣味onNavigationClick()
}
addToolBar(R.id.toolbar\u片段、toolbarTitle、toolbarParent){
presenter.onClickNavigationToolBar()
}
旧答案: 目前,Kotlin仅支持Java接口的SAM转换 (见): 还请注意,此功能仅适用于Java互操作;由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现,因此不受支持 但是,新版本1.4即将改变这一点(请参阅): 社区要求我们为Kotlin类引入SAM转换支持。[…]SAM转换目前仅适用于Java接口和抽象类。这种设计背后的最初想法是为这种用例显式地使用函数类型。然而,事实证明,函数类型和类型别名并不能覆盖所有的用例,人们常常不得不在Java中保留一个接口,只是为了得到SAM转换
哦,谢谢你@jsamol,我不知道它只用于Java接口。你想把它作为一个答案发布,这样我就可以选择它了吗?哦,谢谢你@jsamol,我不知道它只适用于Java接口。你想把它贴出来作为答案,这样我就可以选择它了吗?