我最近切换到Kotlin 1.5.0,该版本弃用sumBy
,在转换过程中,我遇到了来自编译器的奇怪Exception while analyzing expression
错误。
这里有一个产生错误的最小代码,您可以在这里运行:
fun <T> percentify(list: List<T>, fn: (T) -> Boolean): Float {
val okCount = list.sumOf { if (fn(it)) 1 else 0 }
if (list.isEmpty()) return 0f else return okCount/list.size
}
fun main() {
val list = listOf(1, 2, 3)
println(percentify(list) { it % 2 == 1})
}
我的问题是,我使用sumOf
是错误的,还是编译器有问题?
这显然是编译器的一个错误。
如果您显式指定lambda参数的类型(val okCount = list.sumOf { it: T -> if (fn(it)) 1 else 0 }
(,那么它将给您另一个错误(Overload resolution ambiguity.
;这是一个已知的错误,KT-46360(
有趣的是,它能够克服";分辨率模糊性";在这种情况下,如果您将lambda提取到单独的变量中(因此,您可以使用它作为一种变通方法(:
val lambda = { it: T -> if (fn(it)) 1 else 0 }
val okCount = list.sumOf(lambda)
或者,您也可以将lambda表达式的结果显式转换为Int
:
val okCount = list.sumOf { (if (fn(it)) 1 else 0).toInt() }
此外,您需要手动将okCount
转换为Float
,因为(有意(Float
返回类型不存在sumOf
过载
return if (list.isEmpty()) 0f else okCount.toFloat() / list.size