参数含lambda的Kotlin扩展函数在Java中无法调用如何解决?
问题根因
- Kotlin 的
()->Unit函数类型在Java层对应kotlin.jvm.functions.Function0<kotlin.Unit>,要求lambda返回Unit实例,而你当前传入的Java lambda无返回值,和目标方法签名不匹配,因此触发找不到方法的报错。 - 你移除lambda参数后方法签名完全匹配,所以调用正常。
可行解决方案
方案1(无需修改Kotlin代码,改Java调用即可,兼容性最好)
在Java lambda的末尾显式返回Unit.INSTANCE即可匹配签名:
showWarningDialog(this,R.string.alert,R.string.leave_without_saving,() -> { setResult(RESULT_CANCELED); finish(); return Unit.INSTANCE; });
如果IDE提示找不到Unit类,补充导入import kotlin.Unit;即可。
方案2(修改Kotlin代码,适配Java调用习惯)
将Kotlin函数的lambda参数替换为Java友好的函数式接口,后续Java调用不需要额外返回值:
- 定义函数式接口
fun interface OnDialogDoneListener { fun onDone() }
- 修改扩展函数定义
fun Activity.showWarningDialog(title: Int, description: Int, done: OnDialogDoneListener) { done.onDone() }
修改后原有Java调用代码不需要改动即可正常运行。
内容的提问来源于stack exchange,提问作者Usama Saeed US
相关产品推荐
相关产品推荐

