gpt4 book ai didi

java - Scala 中的协方差

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:06 26 4
gpt4 key购买 nike

我在学习Functional Programming Principles in Scala ,当我完成讲座时 Subtyping and Generics ,我对协方差感到困惑:

给定:NonEmpty <: IntSetNonEmptyIntSet 的子类型

List[NonEmpty] <: List[IntSet]或者是 List[NonEmpty]的亚型 List[IntSet]

答案是这是有道理的,因为非空集合列表是任意集合列表的特例。

这个答案是否暗示 List[NonEmpty]List[IntSet] 的子类型?

所以我尝试了这个:

val nonEmpty: List[NonEmpty] = null
val intSet: List[IntSet] = nonEmpty

然后我得到一个编译错误:

Expression of type List[NonEmpty] doesn't conform to expected type List[IntSet]

据我所知,泛型在 Java 中是不变的,泛型在 Scala 中是协变的或者我对协方差有错误的理解?

编辑:

这里是IntSet, NonEmpty, List的定义:

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

最佳答案

首先,你应该知道的是

In Scala, however, generic types have by default nonvariant (or, "rigid") subtyping

协方差意味着

if S is a subtype of type T, then should List[S] be considered a subtype of List[T]

nonvariant 还有一个意思就是

if S is a subtype of type T, then should List[S] not be considered a subtype of List[T]

document会帮助你。只需搜索词 covariance,您就会找到问题的答案。

祝你好运

关于java - Scala 中的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37842671/

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