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)
// これはコンパイルされません
val lionContainer = new PetContainer[Lion](new Lion)
class 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
のサブタイプではないからです。