请解释每种方法的用例和优缺点 .
fun doSomethingWithCallback(callback: Callback) { // Do something callback.call() }
fun doSomethingWithCallback(callback: () -> Unit) { // Do something callback() }
使用 option 1 ,你无法通过lambda调用它 . 例如,这不编译:
doSomethingWithCallback1 { print("helloWorld") }
有趣的是,如果在Java中定义了相同的方法:
void doSomethingWithJavaCallback(JavaCallback callback) { // Do something callback.call(); }
然后 you can call it using a lambda 来自Kotlin . 这是因为Kotlin只对Java中定义的函数进行SAM转换 .
相比之下,如果你使用 option 2 ,你可以使用lambda来调用它 . 从Kotlin和Java调用它时它都可以工作 .
正如评论中所提到的, third option 正在使用这样的类型别名:
typealias Callback = () -> Unit fun doSomethingWithCallback5(callback: Callback) { // Do something callback() }
您可以在函数签名中保留类型 and 在调用站点上使用lambdas .
doSomethingWithCallback { // do whatever you want }
var doSomething: (Any) -> Unit)? = null
和:
doSomething?.invoke(any)
最后和听众一样:
yourvarclass.doSomething = { any -> // this is callback }
2 回答
选项1
使用 option 1 ,你无法通过lambda调用它 . 例如,这不编译:
有趣的是,如果在Java中定义了相同的方法:
然后 you can call it using a lambda 来自Kotlin . 这是因为Kotlin只对Java中定义的函数进行SAM转换 .
选项2
相比之下,如果你使用 option 2 ,你可以使用lambda来调用它 . 从Kotlin和Java调用它时它都可以工作 .
选项3
正如评论中所提到的, third option 正在使用这样的类型别名:
您可以在函数签名中保留类型 and 在调用站点上使用lambdas .
doSomethingWithCallback { // do whatever you want }
var doSomething: (Any) -> Unit)? = null
和:
doSomething?.invoke(any)
最后和听众一样:
yourvarclass.doSomething = { any -> // this is callback }