【发布时间】:2011-02-13 14:18:06
【问题描述】:
我正在研究 Scala 2.8 集合类的源代码。我对scala.collection.Traversable 的层次结构有疑问。查看以下声明:
package scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenericTraversableTemplate[A, Traversable]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr]
with TraversableOnce[A]
package scala.collection.generic
trait HasNewBuilder[+A, +Repr]
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]]
extends HasNewBuilder[A, CC[A] @uncheckedVariance]
问题:为什么Traversable 使用类型参数[A, Traversable] 扩展GenericTraversableTemplate - 为什么不是[A, Traversable[A]]?我尝试了一些具有相同结构的小程序并尝试将其更改为Traversable[A]时得到了一个奇怪的错误消息:
error: Traversable[A] takes no type parameters, expected: one
我猜GenericTraversableTemplate中@uncheckedVariance注解的使用也和这个有关吧? (这似乎是一种潜在的不安全黑客来强制工作......)。
edit - 在this question 中找到一些关于注释的有用答案(这是因为GenericTraversableTemplate 用于具有不同方差的可变和不可变集合)。
问题:当您查看层次结构时,您会看到Traversable 两次继承HasNewBuilder(一次通过TraversableLike,一次通过GenericTraversableTemplate),但类型参数略有不同。这究竟是如何工作的?为什么不同的类型参数不会导致错误?
【问题讨论】:
标签: generics scala scala-2.8 scala-collections