在Scala中,类型参数抽象类型都可以有一个类型边界约束。这种类型边界在限制类型变量实际取值的同时还能展露类型成员的更多信息。比如像T <: A这样声明的类型上界表示类型变量T应该是类型A的子类。下面的例子展示了类PetContainer的一个类型参数的类型上界。

    1. abstract class Animal {
    2. def name: String
    3. }
    4. abstract class Pet extends Animal {}
    5. class Cat extends Pet {
    6. override def name: String = "Cat"
    7. }
    8. class Dog extends Pet {
    9. override def name: String = "Dog"
    10. }
    11. class Lion extends Animal {
    12. override def name: String = "Lion"
    13. }
    14. class PetContainer[P <: Pet](p: P) {
    15. def pet: P = p
    16. }
    17. val dogContainer = new PetContainer[Dog](new Dog)
    18. val catContainer = new PetContainer[Cat](new Cat)
    1. // this would not compile
    2. val lionContainer = new PetContainer[Lion](new Lion)

    PetContainer接受一个必须是Pet子类的类型参数P。因为DogCat都是Pet的子类,所以可以构造PetContainer[Dog]PetContainer[Cat]。但在尝试构造PetContainer[Lion]的时候会得到下面的错误信息:

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

    这是因为Lion并不是Pet的子类。