我创建了一个界面:
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())})
但我收到错误:Type mismatch; required - ProgressListener, found - () -> Unit?
我究竟做错了什么?
正如 @zsmb13 所说,SAM 转换仅支持 Java 接口。
您可以创建一个扩展函数来使其工作:
// 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)
}
})
}
Edit
Kotlin 1.4 引入了函数接口,可以为 Kotlin 中定义的接口启用 SAM 转换。这意味着如果您使用 lambda 定义接口,则可以使用 lambda 调用您的函数fun
关键词。像这样:
fun interface ProgressListener {
fun transferred(bytesUploaded: Long)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)