私はScala2.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
分散が異なる可変コレクションと不変コレクションの両方に使用されるためです)。
質問:階層を見ると、2回(1回はviaと1回はvia )Traversable
継承しますが、型パラメーターがわずかに異なります。これは正確にどのように機能しますか?異なるタイプのパラメーターがエラーを引き起こさないのはなぜですか?HasNewBuilder
TraversableLike
GenericTraversableTemplate