将java lambda传递给kotlin fun时,“Function0不是函数接口”错误

这是我的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()); } } 

在这两种情况下在问题()我从Android Studio中得到以下错误:

Function0不是一个function接口

我如何设置java的onRefreshListener?

在修复了pom文件中kotlin lib的依赖关系之后,我find了3个可能的解决方案。

第一个解决方案 :在java项目中不需要kotlin-stdlib:

在kotlin中添加:

 @FunctionalInterface interface OnRefreshListener { fun onRefresh() } 

并从以下位置更改界面:

 var onRefreshListener: (() -> Unit)? 

至:

 var onRefreshListener: OnRefreshListener? 

以及来自以下方面的调用:

 onRefreshListener?.invoke() 

至:

 onRefreshListener?.onRefresh() 

第二种解决方案 :(感谢@hotkey)需要kotlin-stdlib,kotlin代码没有变化。 在java中更改:

 foo.setOnRefreshListener(() -> onRefreshStarted()); 

至:

 foo.setOnRefreshListener(() -> { onRefreshStarted(); return Unit.INSTANCE; }); 

第三种解决方案 :需要kotlin-stdlib,kotlin没有改变,改变:

 private void onRefreshStarted() {} 

至:

 private Unit onRefreshStarted() {...; return null;} 

我不确定这是为什么你会得到这样的错误,但你可以尝试通过传递一个Unit返回的lambda而不是一个没有返回值的lambda来修复你的代码:

 foo.setOnRefreshListener(() -> { onRefreshStarted(); return Unit.INSTANCE; }); 

由于Function0接口的invoke()返回T ,因此在调用接受Java的() -> Unit的Kotlin方法时,必须传递一个返回Unit的lambda。