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)
// これはコンパイルされません
val lionContainer = new PetContainer[Lion](new Lion)

class PetContainerは型パラメータPを受け取ります。それはPetのサブタイプである必要があります。 DogCatPetのサブタイプなので、新たなPetContainer[Dog]PetContainer[Cat]を作ることができます。 しかしながら、もしPetContainer[Lion]を作ろうとすると、以下のエラーが返ってきます。

type arguments [Lion] do not conform to class PetContainer's type parameter bounds [P <: Pet]

これはLionPetのサブタイプではないからです。

Contributors to this page: