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

124
18

Сегодня я хотел узнать о супертипах 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]]

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


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

спросил(а) 2013-04-29T00:05:00+04:00 6 лет, 11 месяцев назад
1
Решение
97

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


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

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

ответил(а) 2013-04-29T13:05:00+04:00 6 лет, 11 месяцев назад
53

Как только вы достигли 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* могут быть удалены, хотя упрощение иерархии.

ответил(а) 2013-04-29T11:41:00+04:00 6 лет, 11 месяцев назад
36

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

ответил(а) 2013-04-29T11:42:00+04:00 6 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема