2

有:

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)
4

1 回答 1

6

你的方法的签名bar本质上是说,告诉我一些子类型,A我会给你一系列该类型的东西。可能有很多子类型A不是B的子类型(即,在这种情况下是所有子类型),因此实现这样的方法List[B](new B)是行不通的。

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

class NotB extends A {
  def doSomething(): Unit
}

bar[NotB]().head.doSomething()

这也必须编译,但这没有任何意义。

于 2013-08-13T19:01:14.410 回答