&引用;Function0不是一个功能接口;将java lambda传递给kotlin fun时出错

&引用;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

这是我的kotlin代码:

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;}