如何修复在可变集的可变列表上应用reduce以查找所有集合的交集的类型错误?



我想找到abc的交集。由于我想在将来向lst-object 添加更多集合,因此我将其定义为 MutableList。

var a = mutableSetOf(1, 2, 3)
var b = mutableSetOf(2, 3, 4)
var c = mutableSetOf(3, 4, 5)
var lst = mutableListOf(a, b, c)
var intersection = lst.reduce {
acc, currSet -> acc.intersect(currSet)
}

但是,由于类型推断失败,最后一个表达式引发"无效"。(检查这个游乐场(

从文档中,我有以下reduce操作签名:

inline fun <S, T : S> Iterable<T>.reduce(
operation: (acc: S, T) -> S
): S

那么为什么ST不能属于同一类型呢?

为什么在这里需要使用"可变"类型?它将适用于不可变的集合:

val a = setOf(1, 2, 3)
val b = setOf(2, 3, 4)
val c = setOf(3, 4, 5)
val lst = listOf(a, b, c)
val intersection = lst.reduce { acc, currSet -> 
acc.intersect(currSet)
}

问题是intersect返回一个Set,而不是一个MutableSet,这使得类型检查不满意。可通过在reducelambda 中使用acc.intersect(currSet).toMutableSet()或更改为acc: Set<Int>来修复。我总是使用不可变类型,并且更喜欢我上面发布的代码。

Nit:更喜欢val而不是var

最新更新