在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[Pet] 声明方式没啥区别】
类PetContainer必须带一个类型参数P,且这个参数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的子类型