Универсальные (generic) классы (или trait-ы) принимают тип в качестве параметра в квадратных скобках [...]
.
Для обозначения параметров типа согласно конвенции Scala используется одна заглавная буква (например, A
).
Затем этот тип можно использовать внутри класса по мере необходимости
для параметров экземпляра метода или для возвращаемых типов:
// здесь мы объявляем параметр типа A
// v
class Stack[A] {
private var elements: List[A] = Nil
// ^
// здесь мы ссылаемся на этот тип
// v
def push(x: A): Unit =
elements = elements.prepended(x)
def peek: A = elements.head
def pop(): A = {
val currentTop = peek
elements = elements.tail
currentTop
}
}
// здесь мы объявляем параметр типа A
// v
class Stack[A]:
private var elements: List[A] = Nil
// ^
// здесь мы ссылаемся на этот тип
// v
def push(x: A): Unit =
elements = elements.prepended(x)
def peek: A = elements.head
def pop(): A =
val currentTop = peek
elements = elements.tail
currentTop
Эта реализация класса Stack
принимает любой тип в качестве параметра.
Прелесть параметризованных типов состоит в том,
что теперь можно создавать Stack[Int]
, Stack[String]
и т.д.,
что позволяет повторно использовать реализацию Stack
для произвольных типов элементов.
Пример создания и использования Stack[Int]
:
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
println(stack.pop()) // выводит 2
println(stack.pop()) // выводит 1
val stack = Stack[Int]
stack.push(1)
stack.push(2)
println(stack.pop()) // выводит 2
println(stack.pop()) // выводит 1
Подробности о том, как выразить вариантность с помощью универсальных типов, см. в разделе “Вариантность”.
Contributors to this page:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java