Generics 如何修复在可变集合的可变列表上应用reduce以查找所有集合的交点时出现的类型错误?
我想找出Generics 如何修复在可变集合的可变列表上应用reduce以查找所有集合的交点时出现的类型错误?,generics,kotlin,collections,Generics,Kotlin,Collections,我想找出a、b和c的交点。因为我想在将来向lst-对象添加更多集合,所以我将其定义为一个可变列表 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)
a
、b
和c
的交点。因为我想在将来向lst
-对象添加更多集合,所以我将其定义为一个可变列表
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
inline fun Iterable.reduce(
操作:(acc:S,T)->S
):S
那么为什么S
和t
不能属于同一类型呢?为什么需要在这里使用“可变”类型?它适用于不可变集:
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
,这使得类型检查不愉快。可通过使用reduce
lambda中的acc.intersect(currSet).toMutableSet()
或更改为acc:Set
进行修复。我总是使用不可变类型,并且更喜欢我上面发布的代码
Nit:您更喜欢val
而不是var
为什么需要在这里使用“可变”类型?它适用于不可变集:
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
,这使得类型检查不愉快。可通过使用reduce
lambda中的acc.intersect(currSet).toMutableSet()
或更改为acc:Set
进行修复。我总是使用不可变类型,并且更喜欢我上面发布的代码
妮特:我更喜欢
val
而不是var
在我的原始代码中,我还向集合中添加了元素。我知道有toMutableList
,但不幸的是,我的大脑没有成功地连接到sets哈哈。我明白了,我将确保下次检查函数类型。非常感谢。在我的原始代码中,我还在集合中添加元素。我知道有toMutableList
,但不幸的是,我的大脑没有成功地连接到sets哈哈。我明白了,我将确保下次检查函数类型。非常感谢。