Kotlin编译器在分析我对List.sumOf的使用时引发异常
我最近切换到Kotlin 1.5.0,它不推荐使用sumBy,在转换过程中,我在分析编译器的表达式错误时遇到了一个奇怪的Kotlin编译器在分析我对List.sumOf的使用时引发异常,kotlin,Kotlin,我最近切换到Kotlin 1.5.0,它不推荐使用sumBy,在转换过程中,我在分析编译器的表达式错误时遇到了一个奇怪的异常 下面是产生错误的最小代码,您可以运行该代码: fun percentify(列表:列表,fn:(T)->布尔):浮点{ val okCount=list.sumOf{if(fn(it))1 else 0} if(list.isEmpty())返回0f else返回okCount/list.size } 主要内容(){ val list=listOf(1、2、3) prin
异常
下面是产生错误的最小代码,您可以运行该代码:
fun percentify(列表:列表,fn:(T)->布尔):浮点{
val okCount=list.sumOf{if(fn(it))1 else 0}
if(list.isEmpty())返回0f else返回okCount/list.size
}
主要内容(){
val list=listOf(1、2、3)
println(百分比化(列表){it%2==1})
}
我的问题是,我使用的sumOf
是错误的,还是编译器有问题?这肯定是编译器的一个bug
如果明确指定lambda参数的类型(val okCount=list.sumOf{it:T->If(fn(it))1 else 0}
),那么它将给您另一个错误(重载解析歧义。
;这是一个已知的错误,)
有趣的是,在这种情况下,如果将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
,因为()没有sumOf
重载,返回类型为Float
:
return if (list.isEmpty()) 0f else okCount.toFloat() / list.size
谢谢,我提交了一份bug报告()提到了你的答案。