考虑以下代码,我们从中获取列表块,将它们连接起来并打印到stdout:
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:类型推断失败:好玩 Iterable.chunked(size:Int,transform:(List) - > R):List 不能应用于接收器:列表参数: (Int,KFunction6< @ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName Int, @ParameterName CharSequence,@ ParameterName(name =" transform") ((String) - > CharSequence)?,String>)
错误:(4,18)Kotlin:类型不匹配:推断类型是 KFunction6< @ParameterName CharSequence,@ ParameterName CharSequence, @ParameterName CharSequence,@ ParameterName Int,@ ParameterName CharSequence,@ ParameterName(name =" transform")((String) - > CharSequence)?, String>但是(列表) - > ???预计
错误:(4,21)Kotlin:类型推断失败:好玩 Iterable.joinToString(separator:CharSequence = ...,前缀: CharSequence = ...,后缀:CharSequence = ...,限制:Int = ..., 截断:CharSequence = ...,transform:((T) - > CharSequence)? = ...):String不能应用于receiver:List参数: ()
有没有办法用方法引用而不是lambda调用来编译代码?我开始学习Kotlin,但是假设错误源于joinToString
使用了许多默认参数的事实?
答案 0 :(得分:4)
Kotlin问题跟踪器中有an open feature request标题为"支持函数引用,默认值为其他函数类型" ,似乎是你的用例缺少什么工作。
该功能目前的目标版本为1.3。
<强>更新强> 1.3 Kotlin版本不包含此功能,目标版本更新为1.4