【问题标题】:Kotlin method references in place of lambdaKotlin 方法引用代替 lambda
【发布时间】:2025-12-01 12:50:02
【问题描述】:

考虑以下代码,我们在其中获取列表块,将它们连接起来并打印到标准输出:

val l = listOf("1", "2", "3", "4", "5", "6", "7")
l.chunked(3, { a -> a.joinToString()}).forEach(::println)

代码运行没有问题。我想将 lambda 调用 ({ a -> a.joinToString()}) 更改为方法引用,如下所示:

l.chunked(3, l::joinToString).forEach(::println)

使用方法引用的代码无法编译,给出的错误是:

错误:(4, 7) Kotlin: Type inference failed: fun Iterable.chunked(size: Int, transform: (List) -> R): List 不能应用于接收者:列表参数: (Int,KFunction6 CharSequence)?, String>)

错误:(4, 18) Kotlin: Type mismatch: inferred type is KFunction6 CharSequence)?, String> 但是 (List) -> ???预料之中

错误:(4, 21) Kotlin: Type inference failed: fun Iterable.joinToString(分隔符:CharSequence = ...,前缀: CharSequence = ...,后缀:CharSequence = ...,限制:Int = ..., 截断:CharSequence = ...,变换:((T)-> CharSequence)? = ...):字符串不能应用于接收者:列表参数: ()

有没有办法用方法引用而不是 lambda 调用来编译代码?我开始学习 Kotlin,但假设错误源于 joinToString 使用了许多默认参数这一事实?

【问题讨论】:

标签: methods kotlin


【解决方案1】:

在 Kotlin 问题跟踪器中有 an open feature request 标题为“支持将默认值作为其他函数类型的函数引用”,这似乎是您的用例工作所缺少的。

该功能目前的目标版本是 1.3。

更新 Kotlin 1.3 版本不包含此功能,目标版本更新到 1.4

【讨论】:

    最近更新 更多