Только в 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