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

我已经创建了一个界面:

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 中线程和协程的区别

kotlin - 什么时候应该更喜欢 Kotlin 扩展函数?

android - 找不到字段的 setter - 将 Kotlin 与 Room 数据库结合使用

android - 如何在 Android 上使用 Kotlin 显示 Toast?

java - Kotlin 'when' 语句与 Java 'switch'

constructor - 如何在 Kotlin 中扩展具有多个构造函数的类?