Scala之旅(TOUR OF SCALA)——类型上限(UPPER TYPE BOUNDS)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值