请解释每种方法的用例和优缺点。
接口的使用。
fun doSomethingWithCallback(callback: Callback) {
// Do something
callback.call()
}
Run Code Online (Sandbox Code Playgroud)使用高阶函数。
fun doSomethingWithCallback(callback: () -> Unit) {
// Do something
callback()
}
Run Code Online (Sandbox Code Playgroud)使用选项 1,您无法通过 lambda 调用它。例如,这不会编译:
doSomethingWithCallback1 { print("helloWorld") }
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果在 Java 中定义了相同的方法:
void doSomethingWithJavaCallback(JavaCallback callback) {
// Do something
callback.call();
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用Kotlin 中的 lambda 来调用它。这是因为 Kotlin 只对 Java 中定义的函数进行 SAM 转换。
相反,如果您选择选项 2,您可以使用 lambda 来调用它。从 Kotlin 和 Java 调用它时它都可以工作。
正如评论中提到的,第三个选项是使用这样的类型别名:
typealias Callback = () -> Unit
fun doSomethingWithCallback5(callback: Callback) {
// Do something
callback()
}
Run Code Online (Sandbox Code Playgroud)
您可以在函数签名中保留类型并在调用站点上使用 lambda。
| 归档时间: |
|
| 查看次数: |
9340 次 |
| 最近记录: |