В 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-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Контекстные параметры, также известные, как неявные параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета