Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin编译器在分析我对List.sumOf的使用时引发异常_Kotlin - Fatal编程技术网

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

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

我最近切换到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)
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报告()提到了你的答案。