Scala之旅——类型上界

在Scala中,类型参数抽象类型可能受到类型边界的约束。这些类型边界限制了具体的类型变量,同时揭示了关于该类型成员更多的信息。一个类型上界T <: A表明了类型变量T是类型A的子类型。

这里有个例子演示了类PetContainer的类型参数的类型上界:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)
1
val lionContainer = new PetContainer[Lion](new Lion) // this would not compile

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]

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

小鹏 wechat
公众号:数据Man
0%