Верхнее ограничение типа
Параметры типа и члены абстрактного типа могут быть ограничены определенными диапазонами.
Такие диапазоны ограничивают конкретные значение типа
и, возможно, предоставляют больше информации о членах таких типов.
Верхнее ограничение типа T <: A
указывает на то что тип T
относится к подтипу типа A
.
Приведем пример, демонстрирующий верхнее ограничение для типа класса PetContainer
:
abstract class Animal:
def name: String
abstract class Pet extends Animal
class Cat extends Pet:
override val name: String = "Cat"
class Dog extends Pet:
override val name: String = "Dog"
class Lion extends Animal:
override val name: String = "Lion"
class PetContainer[P <: Pet](p: P):
def pet: P = p
val dogContainer = PetContainer[Dog](Dog())
val catContainer = PetContainer[Cat](Cat())
Класс PetContainer
принимает тип P
, который должен быть подтипом Pet
.
Dog
и Cat
- это подтипы Pet
, поэтому можно создать новые PetContainer[Dog]
и PetContainer[Cat]
.
Однако, если попытаться создать PetContainer[Lion]
, то получим следующую ошибку:
val lionContainer = PetContainer[Lion](Lion())
// error:
// Type argument App0.this.Lion does not conform to upper bound App0.this.Pet
// val lionContainer = PetContainer[Lion](Lion())
//
Это потому, что Lion
не является подтипом Pet
.
Ссылки: