android - Kotlin 中的 Listener 和 High-Order 函数有什么区别?

标签 android kotlin

<分区>

请解释每种方法的用例和优缺点。

  1. 界面的使用。

    fun doSomethingWithCallback(callback: Callback) {
        // Do something
        callback.call()
    }
    
  2. 高阶函数的使用。

    fun doSomethingWithCallback(callback: () -> Unit) {
        // Do something
        callback()
    }
    

最佳答案

选项1

使用选项 1,您无法调用它来传递 lambda。例如,这不会编译:

doSomethingWithCallback1 { print("helloWorld") }

有趣的是,如果在 Java 中定义相同的方法:

void doSomethingWithJavaCallback(JavaCallback callback) {
    // Do something
    callback.call();
}

然后您可以使用来自 Kotlin 的 lambda 调用它。这是因为 Kotlin 只对 Java 中定义的函数进行 SAM 转换。

选项 2

相比之下,如果您使用选项 2,您确实可以使用 lambda 调用它。从 Kotlin 和 Java 调用它时,它都可以工作。

选项3

如评论中所述,第三种选择正在使用这样的类型别名:

typealias Callback = () -> Unit

fun doSomethingWithCallback5(callback: Callback) {
    // Do something
    callback()
}

您可以在函数签名中保留类型在调用站点上使用 lambda。

关于android - Kotlin 中的 Listener 和 High-Order 函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529198/

相关文章:

android - Kotlin:伴随对象 lateinit vars 初始化一次吗?

android - 在android中的recyclerview中添加预加载 View

android - Android ExceptionInInitializerError Stripe

java - Kotlin 图像的 Y 轴旋转

java - kotlin 结构相等性检查父类(super class)型吗?

android - 单击按钮更改 Fragment 上的文本

android - 在 Android 版本 >= 5 上绘制导航栏(和其他应用程序)

android - ResourceNotFoundException 怎么调试?

android - 在 android 12 上显示长文本 toast

android - Android在MaterialDialog中对齐中心或对齐右标题和消息