Java Scala中的协方差
我正在学习,当我讲完讲座时,我对协方差感到困惑:Java Scala中的协方差,java,scala,generics,functional-programming,covariance,Java,Scala,Generics,Functional Programming,Covariance,我正在学习,当我讲完讲座时,我对协方差感到困惑: 给定:NonEmpty首先,您应该知道 然而,在Scala中,泛型类型在默认情况下具有非变量(或“刚性”)子类型 协方差意味着 如果S是T型的子类型,则列表[S]应被视为列表[T]的子类型吗 非变量还有另一个含义 如果S是T型的子类型,则列表[S]不应被视为列表[T]的子类型 这将帮助你。只需搜索单词协方差,即可找到问题的答案 祝你好运问题在于你对列表的定义;它的类型参数没有前缀+,以指示类型参数是协变的。将其更改为: trait List[+T
给定:
NonEmpty首先,您应该知道
然而,在Scala中,泛型类型在默认情况下具有非变量(或“刚性”)子类型
协方差意味着
如果S是T型的子类型,则列表[S]应被视为列表[T]的子类型吗
非变量
还有另一个含义
如果S是T型的子类型,则列表[S]不应被视为列表[T]的子类型
这将帮助你。只需搜索单词协方差
,即可找到问题的答案
祝你好运问题在于你对列表的定义
;它的类型参数没有前缀+
,以指示类型参数是协变的。将其更改为:
trait List[+T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
这应该是可编译的(假设您使用的是标准ScalaList
)。NonEmpty
和IntSet
的定义是什么?@AlexeyRomanov:我改为Scala List,它符合,但我不明白为什么它们不是泛型类型。Scala.collection.immutable.List[+A]
在A
上是协变的,如+
符号所示。
abstract class IntSet {
def contains(x: Int): Boolean
def incl(x: Int): IntSet
def union(other: IntSet): IntSet
}
class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {...}
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
trait List[+T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}