10

今日は、 のスーパータイプについて学びたいと思いましたList

sealed abstract class List[+A] extends AbstractSeq[A]
                                  with LinearSeq[A]
                                  with Product
                                  with GenericTraversableTemplate[A, List]
                                  with LinearSeqOptimized[A, List[A]]

うわー、Listすでに 5 つの直接的なスーパータイプがあります。ランダムに 1 つ選んでみましょう。

trait LinearSeq[+A] extends Seq[A]
                       with scala.collection.LinearSeq[A]
                       with GenericTraversableTemplate[A, LinearSeq]
                       with LinearSeqLike[A, LinearSeq[A]]

では、名前が最も似ているものを選びましょう。

trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]] extends SeqLike[A, Repr]

ああ、どこかに到達しているようです。残っているスーパータイプは 1 つだけです。

trait SeqLike[+A, +Repr] extends Any
                            with IterableLike[A, Repr]
                            with GenSeqLike[A, Repr]
                            with Parallelizable[A, ParSeq[A]]

この時点で私はあきらめました。このグラフの深さはどれくらいですか? これらすべてのスーパータイプのうち、概念的に関連しているのはどれで、実装の詳細または最適化のトリックにすぎないのはどれですか?

このような膨大な継承グラフをどのように理解すればよいでしょうか?

4

3 に答える 3

6

ほとんどの親は、実際には実装の詳細と最適化のトリックです。気にしない場合は、LikeまたはTemplate最後にあるものは無視できます。それをリストに適用すると、次のようになりますList <: LinearSeq <: Seq <: Iterable <: Traversable。これらの特性は、(実装の特性ではなく) コード内の引数の型として使用する必要があります。Scala Collections APIで説明されています。

実装の特性がどのように使用されるかを理解したい場合、または独自のコレクションを設計する場合は、このチュートリアルを読む必要があります: The Architecture of Scala Collections .

さらに、特定のメソッドが実際に実装されている場所を知りたい/知りたい場合は、scaladoc のメソッド シグネチャをクリックして説明を展開します。[ 定義クラス]フィールドには、実装場所へのリンクが表示されます。

于 2013-04-29T10:05:45.653 に答える
1

に到達したら、あと少しSeqLikeです。IterableLikeちょうどGenIterableLikeそのTraversableLike上にあり、その上にあるだけTraversableLikeです。TraversableOnceGenTraversableLike

そしてそれTraversableOnceGenTraversableOnce上にあり、それだけです:)

他のユーザーが提供したリンク ( http://docs.scala-lang.org/overviews/collections/overview.html*Likeも参照) は参考になります。これらの型のそれぞれに対応する型があることを知っておく必要があります。表現型パラメータを保持しますRepr

ただし、コレクションを拡張するという観点からは、ほとんどの場合、拡張したい最も具体的なタイプを見つけるだけでSeqLike済みSeq[T]ますSeq[T, YourCollectionType[T]]

ただし、Scala の将来のバージョンでは、Gen*トレイトが削除され、階層がより単純になる可能性があります。

于 2013-04-29T08:41:21.203 に答える