Подтвердить что ты не робот

Потерян в графе наследования коллекций Scala

Сегодня я хотел узнать о супертипах List:

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

Ничего себе, поэтому List уже имеет пять непосредственных супертипов. Пусть выбирают один случайным образом:

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]

А, кажется, мы добираемся куда-то, остался только один супертип:

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

В этот момент я сдался. Насколько глубоко этот график идет? Какие из этих супертипов концептуально релевантны, а какие из них - только детали реализации или трюки оптимизации?

Как можно понять такой огромный граф наследования?

4b9b3361

Ответ 1

Большинство родителей действительно представляют собой детали реализации и трюки оптимизации. Если вас это не волнует, вы можете игнорировать все с Like или Template в конце. Применяя это к спискам, мы имеем: List <: LinearSeq <: Seq <: Iterable <: Traversable. Вы должны использовать эти черты в качестве типов аргументов в своем коде (а не в свойствах реализации). Они описываются в: Scala API коллекций

Если вы хотите понять, как используются черты реализации или создавать собственные коллекции, вы должны прочитать этот учебник: Архитектура Scala Коллекции.

Кроме того, если вы хотите/должны знать, где данный метод действительно реализован, щелкните по сигнатуре метода в scaladoc, чтобы развернуть описание. Поле "Определение классов" показывает ссылки на место реализации.

Ответ 2

Как только вы достигли SeqLike, вы почти там - IterableLike имеет только GenIterableLike и TraversableLike над ним, TraversableLike имеет только TraversableOnce и GenTraversableLike выше.

И TraversableOnce имеет GenTraversableOnce над ним и что он:)

Ссылка, которую предоставил другой пользователь (также http://docs.scala-lang.org/overviews/collections/overview.html), является хорошей ссылкой - вам просто нужно знать, что каждый из этих типы имеют соответствующий тип *Like, который содержит параметр типа представления Repr.

Но с точки зрения расширения коллекций вам просто нужно найти наиболее специфический тип, который вы хотите расширить в большинстве случаев, например SeqLike и расширить Seq[T] и Seq[T, YourCollectionType[T]].

В будущих версиях Scala черты Gen* могут быть удалены, хотя упрощение иерархии.

Ответ 3

Существует хороший обзор иерархии классов коллекции на scala -lang.org.