Ordering如何在JVM中提供带有类型擦除的隐式排序[T] - Scala

时间:2016-11-20 10:05:14

标签: scala implicit type-erasure

在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]

为什么它可以工作?

1 个答案:

答案 0 :(得分:4)

  

为什么它可以工作?

Implicits是编译时功能。也就是说,当您编译代码时,编译器会强制执行需要签出的规则。在这种特殊情况下,类型Ordering[Int]的隐式需要在范围内可用,否则您将收到编译错误。

这意味着在运行时,即使类型已删除,您也可以保证Ordering[Int]可用,即使它看起来像{{1}你已经完成了它能够订购底层Ordering(obj: Object)对象的保证,否则这些对象将不允许你的代码编译。