2016-11-20 72 views
1

在Scala中,使一個類可比我們延伸Ordered[T]在類如何定購提供隱式排序[T],在JVM類型擦除 - 斯卡拉

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

由於[T]將JVM被刪除,它是不可能知道

Ordering[A]Ordering[Int]

爲什麼它可以工作之間的區別?

回答

4

它是如何工作的?

implicits是編譯時間功能。也就是說,編譯代碼時,編譯器會執行需要檢出的規則。在這種特殊情況下,需要在作用域中提供類型爲Ordering[Int]的隱式,否則會出現編譯錯誤。

這意味着,在運行時,即使類型刪除,你能保證會有一個可用的Ordering[Int],即使它看起來像一個Ordering(obj: Object),你已經完成了它的保障能夠訂購潛在的Int對象,否則這些對象將不允許您的代碼進行編譯。