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
Generics 如何修复在可变集合的可变列表上应用reduce以查找所有集合的交点时出现的类型错误?_Generics_Kotlin_Collections - Fatal编程技术网

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哈哈。我明白了,我将确保下次检查函数类型。非常感谢。