Универсальные (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