// 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 TypeabstractsealedJVM: 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 3traitsealed
два ствола иерархии
// уровень 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
abstractJVM primitives
abstract class · reference types
AnyRef
База всех reference types — синоним java.lang.Object.
Добавляет: eq/ne (ссылочное равенство), synchronized, wait, notify.
Все пользовательские классы, трейты и объекты расширяют AnyRef.
Основа всех 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…
Все коллекции — функторы и монады.
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.
Мутабельная 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 typeno instancesnever returnssubtype of ALL