Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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
Java Scala中的协方差_Java_Scala_Generics_Functional Programming_Covariance - Fatal编程技术网

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]
}

这应该是可编译的(假设您使用的是标准Scala
List
)。
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]
}