В Scala параметры типа и члены абстрактного типа могут быть ограничены определенными диапазонами. Такие диапазоны ограничивают конкретные значение типа и, возможно, предоставляют больше информации о членах таких типов. Верхнее ограничение типа T <: A указывает на то что тип T относится к подтипу типа A.
Приведем пример, демонстрирующий верхнее ограничение для типа класса PetContainer:
abstract class Animal {
 def name: String
}
abstract class Pet extends Animal {}
class Cat extends Pet {
  override def name: String = "Cat"
}
class Dog extends Pet {
  override def name: String = "Dog"
}
class Lion extends Animal {
  override def name: String = "Lion"
}
class PetContainer[P <: Pet](p: P) {
  def pet: P = p
}
val dogContainer = new PetContainer[Dog](new Dog)
val catContainer = new PetContainer[Cat](new Cat)
abstract class Animal:
  def name: String
abstract class Pet extends Animal
class Cat extends Pet:
  override def name: String = "Cat"
class Dog extends Pet:
  override def name: String = "Dog"
class Lion extends Animal:
  override def name: String = "Lion"
class PetContainer[P <: Pet](p: P):
  def pet: P = p
val dogContainer = PetContainer[Dog](Dog())
val catContainer = PetContainer[Cat](Cat())
// это не скомпилируется
val lionContainer = new PetContainer[Lion](new Lion)
// это не скомпилируется
val lionContainer = PetContainer[Lion](Lion())
Класс PetContainer принимает тип P, который должен быть подтипом Pet. Dog и Cat - это подтипы Pet, поэтому мы можем создать новые PetContainer[Dog] и PetContainer[Cat]. Однако, если мы попытаемся создать PetContainer[Lion], то получим следующую ошибку:
type arguments [Lion] do not conform to class PetContainer's type parameter bounds [P <: Pet]
Это потому, что Lion не является подтипом Pet.
Contributors to this page:
Contents
- Введение
- Основы
- Единобразие типов
- Классы
- Значения Параметров По умолчанию
- Именованные Аргументы
- Трейты
- Кортежи
- Композиция классов с трейтами
- Функции Высшего Порядка
- Вложенные Методы
- Множественные списки параметров (Каррирование)
- Классы Образцы
- Сопоставление с примером
- Объекты Одиночки
- Регулярные Выражения
- Объект Экстрактор
- Сложные for-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Контекстные параметры, также известные, как неявные параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета