Итак, давайте сначала сделаем различие между интерфейсом и классом. Интерфейс является проектом API, а класс - реализацией такого API.
Интерфейсы в Scala имеют одинаковое имя и различный пакет, чтобы различать их в отношении неизменности: Seq
, immutable.Seq
, mutable.Seq
.
С другой стороны, классы обычно не имеют общего имени. List
- это неизменяемая последовательность, а ListBuffer
- изменяемая последовательность. Существуют исключения, например HashSet
, но это просто совпадение в отношении реализации.
Теперь, и Array
не является частью коллекции Scala, являясь Java-классом, но его оболочка WrappedArray
ясно показывает, где он будет отображаться: как изменяемый класс.
Интерфейс , реализованный WrappedArray
, равен IndexedSeq
, который существует как изменчивый и неизменный признаки.
immutable.IndexedSeq
имеет несколько реализующих классов, включая WrappedString
. Класс общего использования, реализующий его, однако, Vector
. Этот класс занимает ту же позицию, которую класс Array
занимал бы в изменчивой части.
Теперь, использование Vector
не сложнее, чем использование Array
, поэтому я не знаю, почему вы называете это сложным.
Возможно, вы думаете, что это слишком много внутренне, и в этом случае вы ошибаетесь. Все хорошо спроектированные неизменяемые классы persistent , потому что использование неизменяемой коллекции означает создание ее новых копий, поэтому их необходимо оптимизировать для этого, что и делает Vector
.