Kotlin 接口上的 lambda 表达式 [英] lambda expression on interface in Kotlin
问题描述
我正在将一个 Java 项目转换为 Kotlin,我很惊讶 Kotlin 中的接口使代码比 Java 中的代码更重.
I'm converting a project in Java to Kotlin and I'm surprise that interface made the code heavier in Kotlin than in Java.
示例:我想在 MyFragment 的 MainActivity 中设置 onBackPressListener.
Example: I want to set the onBackPressListener in MainActivity from MyFragment.
文件 1:MainActivity,文件 2:MyFragment,文件 3:OnBackPressedListener(接口)
File 1: MainActivity, File 2: MyFragment, File 3: OnBackPressedListener (Interface)
Java 中的文件 1、Kotlin 中的文件 2、Java 中的文件 3:
File 1 in Java, File 2 in Kotlin, File 3 in Java:
activity.setOnBackPressed { /* Do something */ }
Kotlin 中的文件 1,Kotlin 中的文件 2,Java 中的文件 3:
File 1 in Kotlin, File 2 in Kotlin, File 3 in Java:
activity.setOnBackPressed(OnBackPressedListener { /* Do something */ })
Kotlin 中的文件 1、Kotlin 中的文件 2、Kotlin 中的文件 3:
File 1 in Kotlin, File 2 in Kotlin, File 3 in Kotlin:
activity.setOnBackPressed(object: OnBackPressedListener {
override fun onBackPressed() {
/* Do something */
}
})
是否可以在 Kotlin 中拥有 3 个文件并使用 lambda 来设置侦听器?(在 Kotlin 中获得更多代码真是令人沮丧..)
Is it possible to have the 3 files in Kotlin and use lambda to set the listener ? (This is so frustrating to get more code in Kotlin..)
谢谢
推荐答案
lambda 版本仅在 kotlin 与 java 互操作时有效,因为 SAM Conversions
,请参阅 官方文档.
The lambda version works only when kotlin interop with java because SAM Conversions
, see the official documents.
另请注意,此功能仅适用于 Java 互操作;自从科特林具有适当的函数类型,自动将函数转换为Kotlin 接口的实现是不必要的,因此不支持.
Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.
所以如果你想使用 lambda 来设置纯 kotlin 的监听器,你可以像这样定义你的 listener
和 setOnBackPressed
方法:
So if you want use lambda to set the listener with pure kotlin, you can define your listener
and setOnBackPressed
method like this:
var listener: (() -> Unit)? = null
fun setOnBackPressed(l: () -> Unit) {
listener = l
}
然后通过以下方式调用它:
then invoke it by:
listener?.invoke()
这篇关于Kotlin 接口上的 lambda 表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!