Kotlin编译器在分析我对List.sumOf的使用时抛出异常



我最近切换到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

最新更新