我正在研究 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扩展- 为什么不呢?我尝试了一些具有相同结构的小程序的实验,当我尝试将其更改为时收到一条奇怪的错误消息:GenericTraversableTemplate[A, Traversable][A, Traversable[A]]Traversable[A]
error: Traversable[A] takes no type parameters, expected: one
我想@uncheckedVariance注释的使用GenericTraversableTemplate也与此有关?(这似乎是一种潜在的不安全黑客来迫使事情正常工作......)。
编辑- 在这个问题中找到了一些关于注释的有用答案(这是因为GenericTraversableTemplate用于具有不同方差的可变和不可变集合)。
问题:当您查看层次结构时,您会看到它Traversable继承HasNewBuilder了两次(一次 viaTraversableLike和一次 via GenericTraversableTemplate),但类型参数略有不同。这究竟是如何工作的?为什么不同的类型参数不会导致错误?