请帮我理解这段代码。为什么逆变编译? 它只有在我写完类似test_con [Child](new Child)
的类型时才有效class GrandFather {}
class Father extends GrandFather{}
class Child extends Father{}
def test_cov[T <: Father](man: T) = {}
def test_con[T >: Father](man: T) = {}
test_cov(new GrandFather) // failed, and it's right
test_con(new GrandFather)
test_cov(new Child)
test_con(new Child) // don't failed. Why?
答案 0 :(得分:3)
从技术上讲,符号<:
和>:
并不表示协方差和逆变。它们分别称为上限和下限。
至于为什么test_con(new Child)
编译:
由于课程Child
延伸Father
,这意味着每个人都 一个Father
。此外,每种类型T
都被认为是自身的超类型和子类型。这就是为什么将Father
实例传递给方法的原因
def test_con[T >: Father](man: T) = {}
要求超级类型的Father
成功编译。
简而言之:&#34; A Child
是Father
而Father
是Father
&#34;的超级类型。