我正在阅读“Scala in depth”的第一部分,第一部分有两个关于“covariance”和“contrvariance”的句子:
协方差(+ T或?extends T)是指类型可以在继承层次结构中强制转换。
Contravariance(-T或?super T)是指类型可以强制继承层次结构。
我已经阅读了一些关于“协方差”和“逆变”的文件,但在这种背景下我无法理解“强迫”和“强迫”这个词。
答案 0 :(得分:10)
[TOP / ABSTRACT] Thing ↓ Animal ↓ Human ↓ Programmer ↓ Scala Dev [BOTTOM / SPECIFIC]
协方差:接受T或更低。
我要求[+Human]
,我会接受其中任何一项:[Human, Programmer, Scala Dev]
。
逆变法:接受T或更高。
我要求[-Human]
,我会接受其中任何一项:[Thing, Animal, Human]
。
Inariance:接受T而且只接受T.
<强>胁迫。强>
在类型层次结构中向上/向下强制类型意味着检查类型的超/子类型是否传递了类型约束。例如,协变函数需要Human
,但我们只得到Programmer
,没关系,编译器可以强制将Programmer
转换为{{1}满足打字约束。
答案 1 :(得分:1)
在这种情况下,强制意味着编译器可以将类型视为继承层次结构中上下的类型。
将其视为向上转换或向下转换,除非编译器自动执行此操作,因此它不是强制转换(这可能表明执行它需要显式代码)。
答案 2 :(得分:1)
此回复取自Martin Odersky(Scala的创建者)在Coursera上的讲座。我们注意到:
S<:T means: S is a subtype of T, and
S>:T means: S is a supertype of T, or T is a subtype of S.
Say C[T]
是参数化类型,A,B是类型A<:B
。
通常,C[A]
和C[B]
之间存在三种可能的关系:
C[A]<:C[B] ---------> C is covariant
C[A]>:C[B] ---------> C is contravariant
neither C[A] nor C[B] is a subtype of the other ---------> C is nonvariant
Scala允许您通过注释类型参数来声明类型的方差:
class C[+A] { ... } ---------> C is covariant
class C[-A] { ... } ----------> C is contravariant
class C[A] { ... } ----------> C is nonvariant
希望这可能会有所帮助!