当“B类扩展A”和“L<:A”时,为什么`List [B]`不是`Seq [L]`的子类型?

时间:2013-08-13 18:49:35

标签: scala scala-collections

有:

class A
class B extends A

写这是正确的:

val foo: Seq[A] = List[B](new B)

错误时我会错过什么?

def bar[L <: A](): Seq[L] = List[B](new B)

错误:

[error]  found   : List[B]
[error]  required: Seq[L]
[error]     def t[L <: A](): Seq[L] = List[B](new B)

1 个答案:

答案 0 :(得分:6)

bar方法的签名基本上是在说,告诉我一些A的子类型,我会给你一系列类型的东西。 A可能存在很多B的子类型,而List[B](new B)不是子类型(在这种情况下,所有这些子类型),因此实现class NotB extends A { def doSomething(): Unit } bar[NotB]().head.doSomething() 这样的方法不会工作。

更具体地说:假设您的代码已编译,然后我写了以下内容:

{{1}}

这也需要编译,但它没有任何意义。