【发布时间】: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 使用了许多默认参数这一事实?
【问题讨论】:
-
似乎相关:youtrack.jetbrains.com/issue/KT-8834 它的目标版本是 1.3
-
@Michael Seams 非常相关!您可以考虑将您的评论更改为答案吗?