1、上界
在Java泛型里,不表示某个泛型是另外一个泛型的子类型,可以使用extends关键字,
class Dog<T extends Animal> 上界,当然传Animal也是可以的
而在scala中使用符号“<:”,这种形式称之为泛型的上界
class Pair3[T <: Comparable[T]](val first: T, val second: T) {
def smaller = if (first.compareTo(second) < 0) first else second
}
object Main3 extends App{
override def main(args: Array[String]): Unit = {
val p = new Pair3("Fred", "Brooks")
println(p.smaller)
}
}
2、下界
在Java泛型里表示某个泛型是另外一个泛型的父类型,使用super关键字,而在scala中,使用符号“>:”,这种形式称之为泛型的下界。
class Pair4[T](val first: T, val second: T) {
def replaceFirst[R >: T](newFirst: R) = new Pair4[R](newFirst, second)
override def toString = "(" + first + "," + second + ")"
}
object Main4 extends App{
override def main(args: Array[String]): Unit = {
val p = new Pair4("Nick", "Alice")
println(p)
println(p.replaceFirst("Joke"))
println(p)
}
}
在Java中,T同时是A和B的子类型,称之为多界,形式如 <T extends A & B>
在Scala中,对上界和下界不能有多个,但是可以使用混合类型,如 [T <: A with B]
在Java中,不支持下界的多界形式。如 <T super A &B>
这是不支持的。
在Scala中,对复合类型依然可以使用下界,如 [T >: A with B]
如果 def replaceFirst[R >: T] 不写上界,例如def replaceFirst[R ] 编译的时候是可以通过的,但是将返回Pair[Any]
Java
class Dog<T extends Animal> 上界 √
class Dog<T super SmallDog> 下界 √
class Dog<T super A & B> ×
Scala
class Dog[T <: Animal] √
class Dog[T >: Animal] √