在scala中,为了使类可比较,我们在类
上扩展Ordered[T]
case class A(i: Int) extends Ordered[A] {
def compare(that: A): Int = this.i compare that.i
}
和Iteratable[A]
的方法sorted
需要scala.math.Ordering[A]
类型的隐式参数来排序Iterable[A]
Seq[A](A(2),A(1)).sorted // Seq(A(1),A(2)) Ordering will provide Ordering[A]
Seq[A](A(2),A(1)).sorted(Ordering[A]) // Seq(A(1),A(2))
并且Ordering
随播广告对象为Ordering[T]
Iterable[A]
我的问题:Ordering
对象如何为Ordering[T]
提供sorted
。
由于JVM将删除[T]
,因此不可能知道
Ordering[A]
和Ordering[Int]
为什么它可以工作?
答案 0 :(得分:4)
为什么它可以工作?
Implicits是编译时功能。也就是说,当您编译代码时,编译器会强制执行需要签出的规则。在这种特殊情况下,类型Ordering[Int]
的隐式需要在范围内可用,否则您将收到编译错误。
这意味着在运行时,即使类型已删除,您也可以保证Ordering[Int]
可用,即使它看起来像{{1}你已经完成了它能够订购底层Ordering(obj: Object)
对象的保证,否则这些对象将不允许你的代码编译。