在指定泛型类型时,有时需要界定泛型类型的范围,而不是接收任意类型。比如,要求某个泛型类型,必须是某个类的子类,这样在程序中就可以放心的调用父类的方法,程序才能正常的使用与运行。此时,就可以使用上下边界Bounds的特性;
Scala的上下边界特性允许泛型类型是某个类的子类,或者是某个类的父类;
U >: T
这是类型下界的定义,表示下届为T,也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类)。
S <: T
这是类型上界的定义,表示上届为S,也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类)。
代码实例
object TestScala {
//下届
def getCard[T>:B](s:T):Unit={
println("AAA");
}
//上届
def getCard2[T<:B](s:T):Unit={
println("BBB");
}
def main(args: Array[String]): Unit = {
//这里用的是T>:B 表示下届为B,也就是T必须是B的父类(包括B)
//getCard[C](new C())//Error:(13, 12) type arguments [C] do not conform to method getCard's type parameter bounds [T >: B]
getCard[B](new B())
getCard[B](new C())
getCard[A](new A())
//这里D不是B的子类
//getCard[B](new D())//Type mismatch, expected: B, actual: D
//这里用的是T<:B 表示上届为B,也就是T必须为B的子类(包括B)
//getCard2[A](new A())//Error:(18, 13) type arguments [A] do not conform to method getCard2's type parameter bounds [T <: B]
getCard2[B](new B())
getCard2[C](new C())
getCard2[B](new C())
//getCard2[B](new D())//Type mismatch, expected: B, actual: D
}
}
class A{}
class B extends A{}
class C extends B{}
class D{}