scalabook
Generics типы
Универсальные (generic) классы (или trait-ы) принимают тип в качестве параметра в квадратных скобках [...]
.
Для обозначения параметров типа согласно конвенции Scala используется одна заглавная буква (например, A
).
Затем этот тип можно использовать внутри класса по мере необходимости
для параметров экземпляра метода или для возвращаемых типов:
// здесь мы объявляем параметр типа A// vclass 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 = Stack[Int]stack.push(1)stack.push(2)println(stack.pop())// 2println(stack.pop())// 1
Подробности о том, как выразить ковариантность с помощью универсальных типов, см. в разделе "Ковариантность".
Ссылки: