将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。
- 使用Moshi反序列化可以是两种数据types之一的字段
- 如何从Java Kotlin中调用转义字符命名的方法?
- 如何用Kotlin interop强制执行generics
- 重写Kotlin中的Java @Nullable varargs方法,IDE抱怨它没有覆盖任何东西
- Intellij Idea kotlin不能自动导入一些运算符函数,例如+
- 如何获取由javareflection在kotlin扩展中声明的属性或函数
- 调用Rooms inMemoryBuilder方法时,Room Persistence Library运行时异常
- 用Kotlin配置Gradle
- 带有Gradle和Kotlin的JOOQ不会生成文件