&引用;Function0不是一个功能接口;将java lambda传递给kotlin fun时出错
这是我的kotlin代码:&引用;Function0不是一个功能接口;将java lambda传递给kotlin fun时出错,java,kotlin,Java,Kotlin,这是我的kotlin代码: class Foo : Bar { override var onRefreshListener: (() -> Unit)? = null ... } 这就是我在java中尝试做的: class A { private Foo foo; private void onRefreshStarted() {} private void problem() { foo.setOnRefreshListener(this::onRefre
class Foo : Bar {
override var onRefreshListener: (() -> Unit)? = null
...
}
这就是我在java中尝试做的:
class A {
private Foo foo;
private void onRefreshStarted() {}
private void problem() {
foo.setOnRefreshListener(this::onRefreshStarted);
foo.setOnRefreshListener(() -> onRefreshStarted());
}
}
在problem()中的两种情况下,我从Android Studio中得到以下错误:
Function0不是功能接口
如何从java设置onRefreshListener?我不确定这是否正是您出现这种错误的原因,但您可以尝试通过传递一个
单元来修复代码,该单元返回lambda,而不是没有返回值的lambda:
foo.setOnRefreshListener(() -> { onRefreshStarted(); return Unit.INSTANCE; });
由于Function0
接口的invoke()
返回T
,当调用从Java接受()->单元的Kotlin方法时,在修复pom文件中Kotlin库的依赖项后,必须传递返回单元的lambda,以下是我能想出的3种可能的解决方案
第一个解决方案:java项目中不需要kotlin stdlib:
在kotlin中添加:
@FunctionalInterface
interface OnRefreshListener {
fun onRefresh()
}
并将界面更改为:
var onRefreshListener: (() -> Unit)?
致:
以及来自以下方面的调用:
onRefreshListener?.invoke()
致:
第二个解决方案:(感谢@hotkey)需要kotlin stdlib,kotlin代码没有变化。在java更改中:
foo.setOnRefreshListener(() -> onRefreshStarted());
致:
第三种解决方案:需要kotlin标准库,kotlin没有变化,变化:
private void onRefreshStarted() {}
致:
由于某些原因,我看不到kotlin.Unit,请查看问题中的我的更新您是否对build.gradle
中的dependencies{…}
块中的kotlin stdlib
有依赖关系?例如,编译“org.jetbrains.kotlin:kotlin stdlib:1.2.10”
或者它可能是以-jre7
,-jre8
,-jdk7
,-jdk8
结尾的变体之一。您发现了问题!我的kotlin库使用maven publish插件,它没有将依赖项添加到pom文件中——不完全是这样,因为在我的例子中,pom文件中根本没有依赖项
foo.setOnRefreshListener(() -> onRefreshStarted());
foo.setOnRefreshListener(() -> { onRefreshStarted(); return Unit.INSTANCE; });
private void onRefreshStarted() {}
private Unit onRefreshStarted() {...; return null;}