2013-12-10 34 views
4

我读“的Scala在深度”的第一部分,也有关于“协方差”第一部分两个句子和“contrvariance”:如何理解关于“协方差”和“逆变”的两个句子?

协方差(?+ T或延伸T)是当一个类型可以强制继承层次结构。

逆变(-T或?super T)是何时可以强制继承层次结构的类型。

我已经阅读了一些关于“协方差”和“逆变”的文档,但在这里我无法理解“强迫”和“强迫”两个字。

+0

第一个被称为'协方差'(而不是'convariance'),所以我编辑了这个 –

+0

@ 0__谢谢,这是一个硬性的词:) – Freewind

+0

[Scala协方差/逆变问题](http://堆栈溢出。com/questions/663254/scala-covariance-contravariance-question) – dhg

回答

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转换为Human以满足键入约束。

+2

强迫程序员进入人类将会“强迫”。嘿,我刚刚意识到这与你粘贴摘录的内容相反!嗯,我会说作者犯了一个错误。 – Golly

1

在这种情况下,强制意味着编译器可以将该类型视为继承层次上/下的类型。

认为它是上传或下传,除非编译器自动执行,所以它不是强制转换(这可能表明需要显式代码来执行它)。

1

此回复摘自Coursera的Martin Odersky(Scala的创建者)的演讲。我们注意到:

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. 

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 

斯卡拉可以让你通过注释类型参数声明一个类型的差异:

class C[+A] { ... } ---------> C is covariant 
class C[-A] { ... } ----------> C is contravariant 
class C[A] { ... } ----------> C is nonvariant 

希望这可以帮助!