gpt4 book ai didi

lambda - 传递 lambda 而不是接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:26:27 25 4
gpt4 key购买 nike

我已经创建了一个界面:

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)
}

关于lambda - 传递 lambda 而不是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43469241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com