在 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
类的子类。
使用类型界限的泛型类的意思是说泛型类的类型参数只能在某个明确的范围。而使用变化的泛型类的意思是说发声明一个泛型类,这个类可以接收泛型类的类型对应的协变,逆变和不变的泛型类。