带有上限的Scala协变类型声明,为什么方法需要明确地重复上限

时间:2017-05-12 08:45:01

标签: scala generics types covariance

我有一个看起来像这样的特征:

trait Processor[+T <: Document] {
  def process[D >: T <: Document](doc: D)
}

如果我使用process声明process[D >: T](doc: D)方法,则无法访问Document类中的方法。

我不知道为什么我需要在<: Document方法中重复上限process

所以,有两个问题:

  1. 这是应该使用它的方式吗?
  2. 为什么类型系统不会自动从特征定义中获取上限。

1 个答案:

答案 0 :(得分:2)

您方法的上限位于D,而不是T。假设您没有设置上限,那么D可以是T也可以是任何内容,例如Any。因此,编译器必须假设D可能是Any,因此无法为您提供更多方法。