scala上界与下界
类型的上界与下界,是用来定义类型变量的范围,作用于类。
scala上界(Upper Bounds)
scala中上界定义[S <:T]类似于java中上界定义<? extends T>。
定义
S <: T
这是类型上界的定义,S必须是类型T的子类(或本身),自己也可以认为是自己的子类。
代码实现:
class Animals
class Bird extends Animals
class Hawk extends Bird
class 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()
}
}
scala下界(Lower Bounds)
定义:U >: T
这是类型下界的定义,也就是说U必须是类型T的父类(或其本身)。
代码实现:
class Animals1
class Bird1 extends Animals1
class Hawk1 extends Bird1
class 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 Animal
class 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 Bird
class 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的子类(或其本身)。