请解释每种方法的用例和利弊。
使用界面。
fun doSomethingWithCallback(callback: Callback) {
// Do something
callback.call()
}
使用高阶函数。
fun doSomethingWithCallback(callback: () -> Unit) {
// Do something
callback()
}
答案 0 :(得分:1)
使用选项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()
}
您可以将函数签名中的类型和保留在调用站点上使用lambdas。
答案 1 :(得分:0)
您可以使用lambda:
doSomethingWithCallback { // do whatever you want }
我通常使用lambda函数:
var doSomething: (Any) -> Unit)? = null
和
doSomething?.invoke(any)
最后和听众一样:
yourvarclass.doSomething = { any ->
// this is callback
}