Только в Scala 3
Используемый для типов оператор & создает так называемый тип пересечения (intersection type).
Тип A & B представляет собой значения, которые одновременно относятся как к типу A, так и к типу B.
Например, в следующем примере используется тип пересечения Resettable & Growable[String]:
trait Resettable:
  def reset(): Unit
trait Growable[A]:
  def add(a: A): Unit
def f(x: Resettable & Growable[String]): Unit =
  x.reset()
  x.add("first")
В методе f в этом примере параметр x должен быть одновременно как Resettable, так и Growable[String].
Все члены типа пересечения A & B являются типом A и типом B.
Следовательно, как показано, для Resettable & Growable[String] доступны методы reset и add.
Пересечение типов может быть полезно для структурного описания требований.
В примере выше для f мы прямо заявляем, что нас устраивает любое значение для x,
если оно является подтипом как Resettable, так и Growable.
Нет необходимости создавать номинальный вспомогательный trait, подобный следующему:
trait Both[A] extends Resettable with Growable[A]
def f(x: Both[String]): Unit
trait Both[A] extends Resettable, Growable[A]
def f(x: Both[String]): Unit
Существует важное различие между двумя вариантами определения f:
в то время как оба позволяют вызывать f с экземплярами Both,
только первый позволяет передавать экземпляры,
которые являются подтипами Resettable и Growable[String], но не Both[String].
Обратите внимание, что
&коммутативно:A & Bимеет тот же тип, что иB & A.
Contributors to this page:
Contents
- Введение
 - Возможности Scala
 - Почему Scala 3?
 - Почувствуй Scala
 - Пример 'Hello, World!'
 - REPL
 - Переменные и типы данных
 - Структуры управления
 - Моделирование данных
 - Методы
 - Функции первого класса
 - Одноэлементные объекты
 - Коллекции
 - Контекстные абстракции
 - Верхнеуровневые определения
 - Обзор
 - Первый взгляд на типы
 - Интерполяция строк
 - Структуры управления
 - Моделирование предметной области
 - Инструменты
 - Моделирование ООП
 - Моделирование ФП
 - Методы
 - Особенности методов
 - Main методы в Scala 3
 - Обзор
 - Функции
 - Анонимные функции
 - Параметры функции
 - Eta расширение
 - Функции высшего порядка
 - Собственный map
 - Создание метода, возвращающего функцию
 - Обзор
 - Пакеты и импорт
 - Коллекции в Scala
 - Типы коллекций
 - Методы в коллекциях
 - Обзор
 - Функциональное программирование
 - Что такое функциональное программирование?
 - Неизменяемые значения
 - Чистые функции
 - Функции — это значения
 - Функциональная обработка ошибок
 - Обзор
 - Типы и система типов
 - Определение типов
 - Параметризованные типы
 - Пересечение типов
 - Объединение типов
 - Алгебраические типы данных
 - Вариантность
 - Непрозрачные типы
 - Структурные типы
 - Зависимые типы функций
 - Другие типы
 - Контекстные абстракции
 - Методы расширения
 - Параметры контекста
 - Контекстные границы
 - Given импорты
 - Классы типов
 - Многостороннее равенство
 - Неявное преобразование типов
 - Обзор
 - Параллелизм
 - Scala утилиты
 - Сборка и тестирование проектов Scala с помощью Sbt
 - Рабочие листы
 - Взаимодействие с Java