gpt4 book ai didi

java - Kotlin - 作为尾随 Lambda 的接口(interface)

转载 作者:行者123 更新时间:2023-12-01 17:42:20 26 4
gpt4 key购买 nike

哪些规则使接口(interface)能够用作尾随 lambda 参数?

我认为唯一的规则是它的定义具有独特的功能,但是我遇到了以下问题:

我有这个Java接口(interface)

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

Java (2):

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

但是,我最近将接口(interface)迁移到了 Kotlin:

interface ToolbarFragmentCallBack {
fun onNavigationClick()
}

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

Type mismatch: inferred type is () -> Unit but ToolbarFragment.ToolbarFragmentCallBack! was expected

最佳答案

编辑:

Kotlin 1.4 现在可以实现这一点。

但请注意,SAM 转换仍然不适用于标准接口(interface),您必须将接口(interface)显式声明为 functional interface :

fun interface ToolbarFragmentCallBack {
fun onNavigationClick()
}

addToolBar(R.id.toolbar_fragment, toolbarTitle, toolbarParent) {
presenter.onClickNavigationToolBar()
}
<小时/>

旧答案:

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

Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.

但是,新版本 1.4 即将改变这种情况(请参阅 What to Expect in Kotlin 1.4 ):

The community has requested us to introduce support for SAM conversions for Kotlin classes. [...] SAM conversions currently only work for Java interfaces and abstract classes. The initial idea behind this design was to use function types explicitly for such use-cases. It turned out, however, that function types and typealiases don’t cover all the use-cases, and people often had to keep an interface in Java only to get a SAM-conversion for it.

关于java - Kotlin - 作为尾随 Lambda 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59536168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com