前言
上节介绍了 Scala 的泛型,并在最后提到了 Scala 的上界、和下界,这两种表示主要是代替了 Java 的 extends 和 super,那在 Scala 是如何运用的呢,话不多说,开始上菜。
正文
上界
在举出 上界 例子时,会引入 Java 的 Comparable 和 Comparater 两个接口,对它们不熟悉的观众可以看这篇了解一下:Java Comparable 和 Comparator
//类 TypeVariableBound 编译通不过,因为泛型 T 在编译的时候不能确定其具体类型
//即并不是所有的类中都存在 compareTo 方法
class TypeVariableBound {
def compare[T](first:T, second:T) = {
if(first.compareTo(second) > 0) first else second
}
}
object TypeVariableBound {
def main(args:Array[String]): Unit = {
val tvb = new TypeVariableBound
println(tvb.compare("A", "B"))
}
}
但如果使用类型变量界定对泛型 T 的类型进行限定,即 将 T 限定为 Comparable 的子类,
此时 def compare[T](first: T,second: T) 方法中的参数 first 便存在 compareTo 方法,代码如下:
class TypeVariableBound {
//采用 <: 进行类型变量界定该语法的意思是泛型 T 必须是实现了 Comparable 接口的类型
def compare[T <: Comparable[T]](first: T, second: T) = {
if(first.compareTo(second) > 0) first else second
}
}
object TypeVariableBound {
def main(args:Array[String]): Unit = {
val tvb = new TypeVariableBound
//由于 String 类型实现了 Comparable接口下面这种使用方式是合法的
println(tvb.compare("A","B"))
}
}
代码中 tvb.compare("A","B")合法是因为 String 类型实现了 Comparable 接口。
通过代码可以看到,def compare[T <: Comparable[T]](first: T,second: T) 方法由于参数使用了 上界,
只要T为 Comparable 的子类都是合法的。这里的上界 作用在方法 compare 之上,
除此之外 上界 还可作用于 类中的 泛型参数上,例如:
//定义Student类为case class,且泛型T的类型变量界定为 AnyVal
//在创建类时,所有处于 AnyVal 类继承层次结构的类都是合法的,如 Int、Double 等值类型
class Student[T <: AnyVal](var hight: T)
object TypeVariableBound {
def main(args:Array[String]): Unit = {
//下面这条语句是不合法的,因为 String 类型不属于 AnyVal 类层次结构
// valS1 = Student("170")
//下面这两条语句都是合法的,因为Int, Long类型都是 AnyVal
val S2 = new Student(170.0)
valS3 = new Student(170L)
}
}
像T <: AnyVal 这种限制了 T 的最顶层类就被称为上界(Upper Bound)。
与上界对应的是下界(Lower Bound),其语法格式如为[R >: T],即泛型R必须是T的超类。
因为 下界 用到的不多,就不再介绍了
群众一脸懵逼。。。裤子刚脱就结束了?一万个草泥马飘过。。。
不要急!下一节将介绍 scala 界定的 另一大将:视图界定(View Bound)!
(嗯,确定有料~) 不要走开,后面更精彩~~