Kotlin 推断类型是Nullable的集合,但应为非Nullable的集合

Kotlin 推断类型是Nullable的集合,但应为非Nullable的集合,kotlin,collections,nullable,non-nullable,Kotlin,Collections,Nullable,Non Nullable,我打算处理一些数据(这是一个从json对象Nuu解析的列表,在下面的示例中,我只是在列表上打了个小短号)。要处理该集合,我将消费者println传递到方法getAllNuu,该方法检索并解析“json” 尽管我从json接收到的数据包含重复项(基于三个字段中的两个[Nuu.lo,Nuu.la),请参见重写的Nuu.equals-generated),所以我想使用扩展函数Nuu.merge 我没有看到任何错误,直到我尝试编译下面的代码,然后我得到: 错误:(7,5)Kotlin:类型不匹配:推断类

我打算处理一些数据(这是一个从json对象
Nuu
解析的列表,在下面的示例中,我只是在列表上打了个小短号)。要处理该集合,我将消费者
println
传递到方法
getAllNuu
,该方法检索并解析“json”

尽管我从json接收到的数据包含重复项(基于三个字段中的两个[
Nuu.lo
Nuu.la
),请参见重写的
Nuu.equals
-generated),所以我想使用扩展函数
Nuu.merge

我没有看到任何错误,直到我尝试编译下面的代码,然后我得到:
错误:(7,5)Kotlin:类型不匹配:推断类型为集合,但应为集合

为什么kotlin会推断出一个包含可为空对象的集合?它发生在哪里

我也将感谢任何建议,使代码更好或更像kotlin

我的环境:kotlinc jvm 1.3.70(JRE 12.0.1+12)

代码:

fun main(args:Array){
getAllNuu{data->println(mergenus(data))}
}
fun Mergenus(数据:收集):收集=
//将两个相同的(基于相等的)元素分组
data.groupingBy{it}
//^错误:(7,5)Kotlin:类型不匹配:推断类型为集合,但应为集合
//将相等的元素合并为一个元素
.aggregate{},累加器:Nuu?,元素:Nuu,first->
如果(第一)
要素
其他的
累加器!!.merge(元素)
}.价值观
//假设这是一个http请求,它处理
//传入使用者“打印输出”的检索数据
fun getAllNuu(打印输出:(数据:收集)->单位){
val nuuList=listOf(
Nuu(3,“t”,1),
Nuu(5,“6”,2),//假设这是一个http请求
Nuu(7,“a”,3),//刚刚被列表打断
Nuu(3,“a”,4),
努(5,“5”,5),
努(2,“2”,6),
Nuu(3,“t”,7),
Nuu(1,“1”,8),
努(5,“5”,9),
Nuu(2,“2”,10)
)
//处理消费者传递的数据
//从主要方法
printout.invoke(nuuList)
}
数据类Nuu(
瓦洛:内特,
瓦拉:弦,
瓦尔苏:国际
) {
覆盖乐趣等于(其他:任何?):布尔值{
如果(this==other)返回true
if(javaClass!=other?.javaClass)返回false
其他如Nuu
如果(lo!=other.lo)返回false
如果(la!=other.la)返回false
返回真值
}
重写哈希代码():Int{
var结果=低
result=31*result+la.hashCode()
返回结果
}
}
//基于相等的相似性,并将字段“su”相加
fun Nuu.merge(其他:Nuu)=Nuu(lo,la,su+其他.su)

谢谢

除了我在评论(
.aggregate
)中给出的解决方法之外,这也可以在不指定任何其他类型的情况下工作:

    data.groupingBy { it }
        // merging the equal elemnts into one
        .aggregate { _, accumulator: Nuu?, element: Nuu, first ->
            val res = 
                if (first)
                    element
                else
                    accumulator!!.merge(element)
            res
        }.values

我真的看不出你的代码没有编译的任何原因,在我看来,这似乎是一个编译器错误。当然,我也不明白为什么会在这里发生错误,你没有做任何棘手或不寻常的事情。

你能在出现编译错误的代码块中用注释标记这一行吗?当然,添加了注释,错误指向行
data.groupingBy{it}
你可以通过指定
.aggregate
(无需其他更改)。但我不明白为什么它不会自动推断出来……谢谢Alexey。我还注意到,当我从函数
mergenus
中删除返回类型
Collection
时,它起了作用。这很有趣,因为我最初添加它是因为错误(我通常不明确指定返回类型)。我肯定是在之后更改了其他内容。我也不理解这个问题“当我从函数
mergenus
中删除返回类型
Collection
时,它起作用了”,然后您只需调用
println(Collection)
,我想这并不奇怪。
    data.groupingBy { it }
        // merging the equal elemnts into one
        .aggregate { _, accumulator: Nuu?, element: Nuu, first ->
            val res = 
                if (first)
                    element
                else
                    accumulator!!.merge(element)
            res
        }.values