<分区>
请解释每种方法的用例和优缺点。
界面的使用。
fun doSomethingWithCallback(callback: Callback) { // Do something callback.call() }
高阶函数的使用。
fun doSomethingWithCallback(callback: () -> Unit) { // Do something callback() }
<分区>
请解释每种方法的用例和优缺点。
界面的使用。
fun doSomethingWithCallback(callback: Callback) {
// Do something
callback.call()
}
高阶函数的使用。
fun doSomethingWithCallback(callback: () -> Unit) {
// Do something
callback()
}
最佳答案
使用选项 1,您无法调用它来传递 lambda。例如,这不会编译:
doSomethingWithCallback1 { print("helloWorld") }
有趣的是,如果在 Java 中定义相同的方法:
void doSomethingWithJavaCallback(JavaCallback callback) {
// Do something
callback.call();
}
然后您可以使用来自 Kotlin 的 lambda 调用它。这是因为 Kotlin 只对 Java 中定义的函数进行 SAM 转换。
相比之下,如果您使用选项 2,您确实可以使用 lambda 调用它。从 Kotlin 和 Java 调用它时,它都可以工作。
如评论中所述,第三种选择正在使用这样的类型别名:
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 结构相等性检查父类(super class)型吗?
android - 单击按钮更改 Fragment 上的文本
android - 在 Android 版本 >= 5 上绘制导航栏(和其他应用程序)
android - ResourceNotFoundException 怎么调试?