我读“的Scala在深度”的第一部分,也有关于“协方差”第一部分两个句子和“contrvariance”:如何理解关于“协方差”和“逆变”的两个句子?
协方差(?+ T或延伸T)是当一个类型可以强制继承层次结构。
逆变(-T或?super T)是何时可以强制继承层次结构的类型。
我已经阅读了一些关于“协方差”和“逆变”的文档,但在这里我无法理解“强迫”和“强迫”两个字。
我读“的Scala在深度”的第一部分,也有关于“协方差”第一部分两个句子和“contrvariance”:如何理解关于“协方差”和“逆变”的两个句子?
协方差(?+ T或延伸T)是当一个类型可以强制继承层次结构。
逆变(-T或?super T)是何时可以强制继承层次结构的类型。
我已经阅读了一些关于“协方差”和“逆变”的文档,但在这里我无法理解“强迫”和“强迫”两个字。
[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
以满足键入约束。
强迫程序员进入人类将会“强迫”。嘿,我刚刚意识到这与你粘贴摘录的内容相反!嗯,我会说作者犯了一个错误。 – Golly
在这种情况下,强制意味着编译器可以将该类型视为继承层次上/下的类型。
认为它是上传或下传,除非编译器自动执行,所以它不是强制转换(这可能表明需要显式代码来执行它)。
此回复摘自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
希望这可以帮助!
第一个被称为'协方差'(而不是'convariance'),所以我编辑了这个 –
@ 0__谢谢,这是一个硬性的词:) – Freewind
[Scala协方差/逆变问题](http://堆栈溢出。com/questions/663254/scala-covariance-contravariance-question) – dhg