// Scala 3 — Иерархия типов

// Unified type system: Any → Matchable → AnyVal / AnyRef → Nothing

★ Scala 3 (Dotty) · включает новые типы: Matchable, Union, Intersection, Opaque
Any — корень
Matchable (Scala 3)
AnyVal — value types
AnyRef — reference types
Array — мутабельный JVM
IArray — immutable (Scala 3)
immutable коллекции
mutable коллекции
Option / Either
Throwable
Null
Nothing — дно
Scala 3 new
// уровень 0 · абсолютный суперкласс
sealed abstract class · top type
Any
Суперкласс всех типов Scala — единственный тип без суперкласса.
Методы: ==, !=, equals, ##, hashCode, toString,
isInstanceOf[T], asInstanceOf[T]
Top Type abstract sealed JVM: Object + primitives
наследуют Any напрямую
// уровень 1 · Scala 3 — безопасный pattern matching
trait · Scala 3 new · sealed
Matchable
Новый в Scala 3. Маркирует типы, которые можно безопасно сопоставить в match.
Без него Any нельзя матчить — компилятор выдаст предупреждение.
Все конкретные типы (AnyVal, AnyRef) расширяют Matchable.
Параметр типа [T] без ограничения — это Any, не Matchable.
Scala 3 trait sealed
два ствола иерархии
// уровень 2 · value types vs reference types
abstract class · value types
AnyVal
База всех value types. На JVM — примитивы (int, double…), без аллокации на куче.
В nullable-контексте автоматически боксируются в Integer и т.д.
Value class: class Wrapper(val v: Int) extends AnyVal
abstract JVM primitives
abstract class · reference types
AnyRef
База всех reference types — синоним java.lang.Object.
Добавляет: eq/ne (ссылочное равенство), synchronized, wait, notify.
Все пользовательские классы, трейты и объекты расширяют AnyRef.
abstract java.lang.Object
value types (AnyVal → ...)
// уровень 3a · примитивные value types
final class
Int
32-бит знаковое целое.
−2³¹…2³¹−1
Literal: 42, 0xff
int / Integer
final class
Long
64-бит знаковое целое.
Суффикс: 42L
long / Long
final class
Short
16-бит знаковое целое.
−32 768 … 32 767
short / Short
final class
Byte
8-бит знаковое.
−128 … 127
byte / Byte
final class
Float
IEEE 754, 32-бит.
Суффикс: 3.14f
float / Float
final class
Double
IEEE 754, 64-бит.
По умолчанию: 3.14
double / Double
final class
Char
UTF-16 символ.
Literal: 'A', '\n'
Является AnyVal, не Int
char / Character
final class
Boolean
true / false.
Операторы: &&, ||, !
boolean / Boolean
final class · singleton
Unit
Аналог void.
Единственное значение: ().
Функции без return → Unit
void
reference types (AnyRef → ...)
// уровень 3b · прямые наследники AnyRef
final class
String
java.lang.String. Неизменяемая последовательность символов.
Интерполяция: s"hi $name", f"$x%.2f", raw"\n", s"""...
java.lang.String
trait · sealed
Product
Основа всех case class и кортежей.
productArity: Int, productElement(n), productIterator.
Реализуется автоматически при case class.
traitsealed
trait · Scala 3
scala.reflect.Enum
База всех Scala 3 enum.
enum Color { case Red, Green, Blue }
Методы: ordinal: Int, values, valueOf.
В отличие от Java — может иметь параметры и методы.
Scala 3trait
trait · covariant
Iterable[+A]
Корень иерархии коллекций.
iterator: Iterator[A], map, filter, flatMap, foldLeft
Все коллекции — функторы и монады.
traitimmutable
sealed abstract class · covariant
Option[+A]
Монада Optional. Заменяет null.
Some(value) / None.
Методы: map, flatMap, getOrElse, fold, orElse
sealed
sealed abstract class
Either[+A, +B]
Left[A] (ошибка) / Right[B] (успех).
Right-biased: map/flatMap работают с Right.
Альтернатива Try для функциональной обработки ошибок.
sealed
class
Throwable
База исключений и ошибок.
message: String, cause: Throwable, getStackTrace.
try { } catch { case e: Ex => }
java.lang.Throwable
final class · special
Null
Подтип всех AnyRef-типов.
Единственное значение: null.
В Scala 3 есть флаг -Yexplicit-nulls, делающий null явным. Предпочитай Option.
avoidexplicit-nulls
final class · mutable
Array[T]
Обёртка над JVM-массивом T[].
Мутабельный, фиксированного размера. O(1) доступ.
ИнвариантенArray[Int]Array[Any].
Через ArrayOps получает все методы Seq.
mutableT[]invariant
opaque type · Scala 3
IArray[+T]
opaque type IArray[+T] = Array[T]
Иммутабельный массив — нулевой overhead!
Компилятор запрещает мутацию снаружи.
Ковариантен: IArray[Int] <: IArray[Any].
Scala 3 эксклюзив, быстрее чем Vector.
Scala 3immutableopaque
Iterable → immutable.* и mutable.* ветви
// уровень 4a · immutable vs mutable интерфейсы
trait · immutable
immutable.Seq[+A]
Упорядоченная неизменяемая последовательность.
apply(i), length, indexOf, sorted
immutableread-only
trait · immutable
immutable.Set[A]
Множество без дублей.
contains, union, intersect, diff
immutable
trait · immutable
immutable.Map[K,+V]
Пары ключ-значение.
get(k), updated(k,v), keys, values
immutable
trait · mutable
mutable.Seq[A]
Упорядоченная мутабельная последовательность.
update(i, v), sortInPlace()
mutable
trait · mutable
mutable.Set[A]
Мутабельное множество.
add(e), remove(e), clear()
mutable
trait · mutable
mutable.Map[K,V]
Мутабельная Map.
put(k,v), remove(k), update(k,v)
mutable
final case class
Some[+A]
Содержит значение value: A.
Some(42)
case object
None
Отсутствие значения.
Option.empty[A] = None
final case class
Left[+A, +B]
Левое (ошибочное) значение.
Left("error")
final case class
Right[+A, +B]
Правое (успешное) значение.
Right(42)
class
Exception
Ожидаемые ошибки.
RuntimeException, IOException, IllegalArgumentException
java.lang.Exception
class
Error
Критические ошибки JVM.
StackOverflowError, OutOfMemoryError. Не перехватывай!
java.lang.Error
иммутабельные реализации коллекций
// уровень 5a · immutable collections
sealed abstract class
List[+A]
Односвязный список. :: / Nil.
O(1) prepend. Pattern: case h :: t
sealedimmutable
final class
Vector[+A]
O(log₃₂ n) доступ и обновление.
Лучший выбор для произвольного доступа.
immutable
sealed abstract class
LazyList[+A]
Ленивый список. Заменяет Stream.
LazyList.iterate(0)(_ + 1) — ∞
replaces Streamlazy
sealed abstract class
ArraySeq[+T]
Иммутабельная обёртка над Array.
Ковариантна. O(1) доступ. Без боксинга для примитивов.
immutablebacked by Array
final class
Queue[+A]
Функциональная FIFO-очередь.
O(1) enqueue/dequeue амортизированно.
Два внутренних списка.
immutable
final class
Range
Целочисленный диапазон без хранения элементов.
1 to 10, 0 until 100 by 2
O(1) память независимо от размера!
immutableInt only
final class
NumericRange[T]
Диапазон для любого числового типа.
BigDecimal, Long, Float
Требует Integral[T] или Fractional[T].
immutable
final class
HashSet[A]
Set на хэш-таблице (HAMT). O(1) lookup.
Порядок не гарантирован.
immutable
final class
TreeSet[A]
Отсортированный Set (red-black).
O(log n). Требует Ordering[A].
immutablesorted
final class
ListSet[A]
Set на связном списке.
Сохраняет порядок вставки. O(n) lookup.
Только для маленьких коллекций.
immutable
final class
BitSet
Set для неотрицательных Int значений.
Хранит как битовую маску. Крайне компактен.
BitSet(1, 3, 5)
immutableInt only
final class
HashMap[K,+V]
Map на хэш-таблице (HAMT). O(1) lookup.
Структурное sharing при обновлениях.
immutable
final class
TreeMap[K,+V]
Отсортированная Map (red-black).
O(log n). Требует Ordering[K].
immutablesorted
final class
VectorMap[K,+V]
Map с гарантированным порядком вставки.
O(1) lookup + сохраняет порядок.
Добавлен в Scala 2.13.
immutableordered
trait
SortedMap[K,+V]
Трейт сортированной Map.
Impl: TreeMap. Требует Ordering[K].
immutable
sealed class · Scala 3
Tuple
(1, "hi", true) : (Int, String, Boolean)
EmptyTuple + *: cons.
Неограниченная арность. Match types.
Scala 3immutable
мутабельные реализации коллекций
// уровень 5b · mutable collections
final class · mutable
ArrayBuffer[A]
Динамический массив. O(1) амортизированный append.
+=, -=, insert, remove
mutablearray backed
final class · mutable
ArrayDeque[A]
Двусторонняя очередь на кольцевом буфере.
O(1) prepend и append с обоих концов.
Замена mutable.Queue и Stack.
mutabledeque
final class · mutable
ListBuffer[A]
Буфер для построения List.
O(1) prepend/append. .toList — O(1)!
Стандартный способ строить List.
mutable
final class · mutable
mutable.HashSet[A]
Мутабельный Set на хэш-таблице.
O(1) add/remove/contains.
mutable
mutable · sorted
mutable.TreeSet[A]
Мутабельный отсортированный Set.
O(log n). Требует Ordering[A].
mutablesorted
final class · mutable
mutable.HashMap[K,V]
Мутабельная Map на хэш-таблице.
O(1) put/get/remove.
mutable
final class · mutable
mutable.TreeMap[K,V]
Мутабельная отсортированная Map.
O(log n). scala.collection.mutable.
mutablesorted
final class · mutable
LinkedHashMap[K,V]
Мутабельная Map с порядком вставки.
O(1) доступ + сохраняет порядок.
scala.collection.mutable
mutableordered
специальные типы и возможности Scala 3

// Scala 3 — новые конструкции системы типов

Union Types A | B
Значение является либо A, либо B.
def f(x: Int | String): String
Pattern matching работает исчерпывающе.
Заменяет Either в простых случаях.
Intersection Types A & B
Значение является одновременно A и B.
def f(x: Resizable & Drawable): Unit
Заменяет составные трейты в большинстве мест.
Коммутативен: A & B =:= B & A.
Opaque Type Aliases
opaque type Meters = Double
Нулевой overhead. Снаружи — непрозрачный тип.
Внутри scope — это Double. Замена value class.
extension добавляет методы.
Type Lambdas
[X] =>> F[X]
Лямбда на уровне типов. Kind-полиморфизм.
type MyFunctor = [A] =>> Either[String, A]
Заменяет type projection ({type T[A] = F[A]})#T.
Singleton Types
val x: 42 = 42 — тип литерала.
"hello".type — синглтон конкретного значения.
Основа для type-level computation.
42 <:< Int, но не наоборот.
Match Types
Вычисление типов через pattern matching:
type Elem[X] = X match
case Seq[a] => a
case String => Char
Позволяет зависимые типы на уровне типов.
Context Types (given / using)
given Ordering[Int] = ...
def sort[A](xs: List[A])(using Ordering[A])
Замена implicit в Scala 2.
Основа type class pattern. CanEqual[-L,-R] управляет ==.
Dependent Function Types
(x: A) => x.Result
Тип результата зависит от значения аргумента.
Настоящие зависимые типы в системе типов.
def f: (e: Entry) => e.type
нижний тип — подтип абсолютно всех типов
// дно иерархии · bottom type
final abstract class · bottom type
Nothing
Подтип каждого типа — включая AnyVal, AnyRef, Null, пользовательские.
Экземпляры создать невозможно — тип без населения.

Применения:
throw new Exception() — тип выражения Nothing
def ??? : Nothing = throw new NotImplementedError()
def fail(msg: String): Nothing = throw RuntimeException(msg)
@tailrec def loop(): Nothing = loop() — бесконечный цикл

В ковариантных позициях: List[Nothing] <: List[A] для любого A.
Nil имеет тип List[Nothing].
bottom type no instances never returns subtype of ALL