gpt4 book ai didi

scala - 将 Scala 集与子类型集相交

转载 作者:行者123 更新时间:2023-12-04 18:09:31 25 4
gpt4 key购买 nike

为什么这个函数不能编译?

case class MyType(n: Int)
def intersection(s1: Set[MyType], s2: Set[_ <: MyType]) =
(s1 & s2)

我收到以下错误:

error: type mismatch; found : Set[_$1] where type _$1 <: MyType required: scala.collection.GenSet[MyType] Note: _$1 <: MyType, but trait GenSet is invariant in type A. You may wish to investigate a wildcard type such as _ <: MyType. (SLS 3.2.10) (w & r)



是否有一种简单的方法可以在不使用 asInstanceOf 的情况下“提升”第二个参数以键入 Set[MyType]?

最佳答案

这是因为 Set定义为 Set[A] .它是不变的而不是协变的。
&被定义为

def &(that: GenSet[A]): Set[A]

它期望和类型为 Set[A] 的参数.但您提供的是 Set[_ <: MyType] .
Set[_ <: Mytype]Set[MyType] 协变.但正如声明所说,参数应该是不变的,即 Set[MyType] ,因此错误。

PS:您可以将协方差视为从窄到宽的类型转换。例如:如果 Dog扩展 Animal如果你这样做 Animal a = new Dog() ,你有一只狗(窄)转换为动物(宽)。在它上面期望不变类型。即如果它期望 Animal ,您只能提供 Animal只要。另一个例子是 java.util.ArrayList这是不变的。

关于scala - 将 Scala 集与子类型集相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18011189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com