我正在研究 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
),但类型参数略有不同。这究竟是如何工作的?为什么不同的类型参数不会导致错误?