关于 Scala 界定、隐式转换的一些知识(四)——Ordering 和 Ordered

在上一节中,我们首次接触了 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)
}

你可能感兴趣的:(关于 Scala 界定、隐式转换的一些知识(四)——Ordering 和 Ordered)