Потерян в графе наследования коллекций 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]]
В этот момент я сдался. Насколько глубоко этот график идет? Какие из этих супертипов концептуально релевантны, а какие из них - только детали реализации или трюки оптимизации?
Как можно понять такой огромный граф наследования?
Ответы
Ответ 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.