在JVM-Scala中,排序如何通过类型擦除提供隐式排序[T]
在scala中,为了使类具有可比性,我们在类上扩展了在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))
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
对象进行排序的保证,否则这些对象将不允许您的代码进行编译