scala之旅-核心语言特性【类型上界】(二十一)

在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的子类型

原文地址:https://www.cnblogs.com/zhouwenyang/p/14003676.html