如何理解关于“协方差”和“逆变”的两句话?

时间:2013-12-10 15:38:49

标签: scala type-systems

我正在阅读“Scala in depth”的第一部分,第一部分有两个关于“covariance”和“contrvariance”的句子:

  

协方差(+ T或?extends T)是指类型可以在继承层次结构中强制转换。

     

Contravariance(-T或?super T)是指类型可以强制继承层次结构。

我已经阅读了一些关于“协方差”和“逆变”的文件,但在这种背景下我无法理解“强迫”和“强迫”这个词。

3 个答案:

答案 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

希望这可能会有所帮助!