本文共 1807 字,大约阅读时间需要 6 分钟。
类型的上界与下界,是用来定义类型变量的范围,作用于类。
scala中上界定义[S <:T]类似于java中上界定义<? extends T>。
定义
S <: T
这是类型上界的定义,S必须是类型T的子类(或本身),自己也可以认为是自己的子类。
代码实现:
class Animalsclass Bird extends Animalsclass Hawk extends Birdclass Upper [T <:Bird]{ def see(): Unit ={ println("look!!!") }}object UpperDemo{ def main(args: Array[String]): Unit = { //正确 new Upper[Hawk].see() new Upper[Bird].see() //错误 new Upper[Animals].see() }}
定义:U >: T
这是类型下界的定义,也就是说U必须是类型T的父类(或其本身)。
代码实现:
class Animals1class Bird1 extends Animals1class Hawk1 extends Bird1class Lower1 [U >:Bird1]{ def see(): Unit ={ println("look!!!") }}object Lower1Demo{ def main(args: Array[String]): Unit = { //正确 new Lower1[Bird1].see() new Lower1[Animals1].see() //错误 new Lower1[Hawk1].see() }}
注意:同包下面的类名或者对象名不能重复
Scala的类或特征的范型定义中,如果在类型参数前面加入+符号,就可以使类或特征变为协变了。
代码实现:
//父类:动物class Animal//子类:鸟class Bird extends Animalclass EatSomething[+T](t:T){ }object Demo1{ def main(args: Array[String]): Unit = { //创建一个EatSomething[Bird]对象 val value = new EatSomething[Bird](new Bird) //Bird 是Animal的子类,但是EatSomething[Bird] 不是EatSomething[Animal]的子类 var a:EatSomething[Animal] = value //错误 var a1:EatSomething[Hawk] = value }}
只能赋值给T的父类(或其本身)。
在类或特征的定义中,在类型参数之前加上一个-符号,就可定义逆变范型类和特征了。
代码实现:
//父类:动物class Animal//子类:鸟class Bird extends Animal//子类:鹰class Hawk extends Birdclass EatSomething[-T](t:T){ }object Demo1{ def main(args: Array[String]): Unit = { //创建一个EatSomething[Bird]对象 val value = new EatSomething[Bird](new Bird) //Bird 是Animal的子类,但是EatSomething[Bird] 不是EatSomething[Animal]的子类 var a:EatSomething[Hawk] = value //错误 var a1:EatSomething[Animal] = value }}
只能赋值为T的子类(或其本身)。
转载地址:http://tuve.baihongyu.com/