Tour of Scala

Верхнее Ограничение Типа

Language

В 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: