我已经创建了一个界面:
interface ProgressListener {
fun transferred(bytesUploaded: Long)
}
但只能将其用作匿名类,不能用作 lambda
dataManager.createAndSubmitSendIt(title, message,
object : ProgressListener {
override fun transferred(bytesUploaded: Long) {
System.out.println(bytesUploaded.toString())
}
})
我认为应该可以用 lambda 代替它:
dataManager.createAndSubmitSendIt(title, message, {System.out.println(it.toString())})
但我收到错误:类型不匹配; required - ProgressListener,找到 - () -> Unit?
我做错了什么?
最佳答案
正如@zsmb13 所说,SAM 转换仅支持 Java 接口(interface)。
你可以创建一个扩展函数来让它工作:
// Assuming the type of dataManager is DataManager.
fun DataManager.createAndSubmitSendIt(title: String,
message: String,
progressListener: (Long) -> Unit) {
createAndSubmitSendIt(title, message,
object : ProgressListener {
override fun transferred(bytesUploaded: Long) {
progressListener(bytesUploaded)
}
})
}
Kotlin 1.4 引入了函数接口(interface),可为 Kotlin 中定义的接口(interface)启用 SAM 转换。这意味着如果您使用 fun
关键字定义接口(interface),则可以使用 lambda 调用函数。像这样:
fun interface ProgressListener {
fun transferred(bytesUploaded: Long)
}
https://stackoverflow.com/questions/43469241/
相关文章:
spring - 如何在基于 Spring 的强类型语言中正确执行 PATCH - 示例
android - Kotlin: "return@"是什么意思?
unit-testing - 在 Kotlin 中测试预期的异常
android - 在当前主题中找不到样式 'cardView Style'
kotlin - 什么时候应该更喜欢 Kotlin 扩展函数?
android - 找不到字段的 setter - 将 Kotlin 与 Room 数据库结合使用
android - 如何在 Android 上使用 Kotlin 显示 Toast?