传递 lambda 而不是接口

2024-04-24

我创建了一个界面:

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(使用前将#替换为@)

传递 lambda 而不是接口 的相关文章

随机推荐