将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?

2 Solutions collect form web for “将java lambda传递给kotlin fun时,“Function0不是函数接口”错误”

在修复了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。

  • 插件没有在Android自动构建中发现gradle错误
  • Android中的与Kotlin的AsyncTask
  • 布尔 - 在Kotlin中的Int转换
  • Java的互操作性:如何在Kotlin中声明一个编译时数组常量?
  • Kotlin:如何将列表转换为与列表映射?
  • 在Kotlin中使用数据类的特征?
  • 在kotlin中扩展DataInputStream
  • 使用kotlin创建一个数据库工厂
  • 目录路径列表中的节点层次结构
  • Android studio3.0 kotlin classNotFoundException
  • 将多个方法合并为一个函数的方法
  • Kotlin language will be the best programming language for Android.