【问题标题】:Scala covariant type declaration with an upper bound, why do methods need to repeat the upper bound exlplicitly带有上限的Scala协变类型声明,为什么方法需要显式地重复上限
【发布时间】:2017-10-11 12:12:53
【问题描述】:

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

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

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

我不知道为什么我需要在process方法中重复上界&lt;: Document

那么,两个问题:

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

【问题讨论】:

  • process[D &gt;: T](doc: D)中,DT的超类型,Document的子类型,所以D不一定是Document

标签: scala generics types covariance


【解决方案1】:

你方法的上限是D,而不是T。假设你没有设置这个上限,那么D 可以是T 也可以是任何东西,例如Any。所以编译器必须假设D可以是Any,因此不能给你更多的方法。

【讨论】:

  • 哈哈,是的。现在我觉得问这个问题很傻。谢谢。
猜你喜欢
  • 2020-03-29
  • 2011-04-16
  • 2013-03-27
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多