在JVM-Scala中,排序如何通过类型擦除提供隐式排序[T]

在JVM-Scala中,排序如何通过类型擦除提供隐式排序[T],scala,implicit,type-erasure,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]的隐式参数来排序Iteratable[A] Seq[A](A(2),A(1)).sorted // Seq(A(1),A(2))

在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]
的隐式参数来排序
Iteratable[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
伴随对象为
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
对象如何向
sorted
提供
Ordering[T]

因为JVM将删除
[T]
,所以不可能知道它们之间的区别

订购[A]
订购[Int]

为什么它可以工作

它怎么会起作用

隐式是编译时特性。也就是说,在编译代码时,编译器强制执行需要签出的规则。在这种特殊情况下,类型为
Ordering[Int]
的隐式函数需要在作用域中可用,否则会出现编译错误

这意味着在运行时,即使类型被擦除,也可以保证有可用的
排序[Int]
,即使它看起来像
排序(obj:Object)
,您已经实现了它能够对底层
Int
对象进行排序的保证,否则这些对象将不允许您的代码进行编译

它怎么会起作用

隐式是编译时特性。也就是说,在编译代码时,编译器强制执行需要签出的规则。在这种特殊情况下,类型为
Ordering[Int]
的隐式函数需要在作用域中可用,否则会出现编译错误

这意味着在运行时,即使类型被擦除,也可以保证有可用的
排序[Int]
,即使它看起来像
排序(obj:Object)
,您已经实现了它能够对底层
Int
对象进行排序的保证,否则这些对象将不允许您的代码进行编译