斯卡拉的逆变

时间:2017-08-04 21:37:22

标签: scala

请帮我理解这段代码。为什么逆变编译? 它只有在我写完类似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?

1 个答案:

答案 0 :(得分:3)

从技术上讲,符号<:>:并不表示协方差和逆变。它们分别称为上限下限

至于为什么test_con(new Child)编译:

由于课程Child延伸Father,这意味着每个人都 一个Father。此外,每种类型T都被认为是自身的超类型和子类型。这就是为什么将Father实例传递给方法的原因 def test_con[T >: Father](man: T) = {}要求超级类型的Father成功编译。

简而言之:&#34; A ChildFatherFatherFather&#34;的超级类型。

相关问题