在上一节中,我们首次接触了 scala 的 Ordering 与 Ordered ,先看Ordering、Ordered 的类的定义:
trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
...
}
trait Ordered[A] extends Any with java.lang.Comparable[A] {
...
//我们可以直接使用 > 、< 等符号直接进行比较,更加方便
def < (that: A): Boolean = (this compare that) < 0
def > (that: A): Boolean = (this compare that) > 0
...
}
我们看到,Ordering 继承了 Comparator 接口,而 Ordered 继承了 Comparable 接口,对 Comparator 和 Comparable 不熟悉的朋友,可以看下这篇文章:Java Comparable 和 Comparator。
Ordering 混入了 Comparator,Ordered 混入了 Comparator,它们之间的区别和Comparable 与 Comparator 间的区别是相同的。这里先给出一个 Ordered 在 scala中的用法,Ordering 的用法,将在 上下文界定的时候具体讲解:
case class Student(val age: Int) extends Ordered[Student] {
override def compare(that: Student): Int = {
this.age - that.age
}
}
//将类型参数定义为 T <: Ordered[T]
class Pair1[T <: Ordered[T]](val first: T, val second: T) {
//比较的时候直接使用 < 符号 进行对象间的比较
//它最终调用的是 Student 中 compare 方法,来比较出两个值的大小
def smaller() = {
if(first < second) first else second
}
}
object OrderedViewBound extends App {
val p = new Pair1(Student(18), Student(26))
//最终比较出较小的值
println(p.smaller)
}