Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kotlin-作为后续lambda的接口_Java_Kotlin_Lambda_Interface - Fatal编程技术网

Java Kotlin-作为后续lambda的接口

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

哪些规则使接口能够用作后续lambda参数

我认为唯一的规则是它在定义上有一个独特的功能,但是我陷入了以下问题:

我有一个Java接口

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接口。你想把它贴出来作为答案,这样我就可以选择它了吗?