2016-08-21 90 views
0

我不明白SeqLike特質中的sorted方法的簽名目的:簽名分類方法的

def sorted[B >: A](implicit ord: Ordering[B]): Repr 

更精確,我不明白:

  1. 原因B>:A
  2. Repr是什麼意思?

也許你可以對此有所瞭解。

在此先感謝您的回答!

回答

2
  1. 該方法採用隱式Ordering應該能夠處理一些超的A(因此B >: A)。即您應該可以使用Ordering[AnyVal]來比較Int值(因爲AnyVal是超類型Int)。
  2. Repr是描述爲「包含元素的實際集合的類型」的SeqLike特徵本身的類型參數(SeqLike[+A, +Repr])。這是爲了確保像sorted這樣的方法將返回相同類型的集合(例如List.sorted仍然是List)。
+0

我還是不明白1的必要性。你能給我一個例子,說明爲什麼我應該能夠使用Ordering [AnyVal]來比較Int,而不僅僅是一個簡單的Ordering [Int]。所以,我沒有理解什麼,我不明白爲什麼。 – Adrian

+0

感謝第2點。不過,現在已經很清楚了! – Adrian

+0

如果您有訂購[動物],您應該可以對列表[狗]進行排序。 –

2

[B >: A]意味着sorted可以與B,任何順序,其中B是A

的超類型被稱爲我想A是性狀本身的類型參數,即

SeqLike被定義爲SeqLike[A, This]。詳盡,如SeqLike[A, +This <: SeqLike[A, This] with Seq[A]]This <: SeqLike[A, This]是F-界限多態性。

trait A[T <: A[T]] {} // the type parameter to A must be an A 
class C extends A[C] {} // this is how you use it. 

actual return type of SeqLike.sortedThis

這很有用,因爲這使得SeqLike的方法不僅可以返回SeqLike,還可以返回子類型!

回過頭來看看這個簡單爲例較早...

trait Model[T <: Model[T]] { 
    def find(id: Int): T = ... 
} 
class User extends Model[User] 
val model: User = new User().find(3) # no need to cast. 
+0

對於我的理解水平,您的答案暫時過於複雜。當我的Scala理解發展時,我會回到它。請參閱我對Costi的評論,以更詳細地瞭解我最初的問題。謝謝!!我贊成你,但由於我在SO上的歷史和聲譽有限,所以這些觀點尚未顯現。 – Adrian

+0

沒問題:-)。希望它能在未來幫助別人! – Ven

0

下面是一個簡單的解釋,爲什麼B >: A

讓我們考慮這個類(不編譯):

class C[+T] { 
    def m(x: T): T = x 
} 

+T意味着協變,即C[Any]是例如超C[Int]。現在("123"String,所以它也Any):

val cInt: C[Any] = new C[Int] 
cInt.m("123") // ??? We are supposed to return Int here 

在現實:

class C[+T] { 
    def m[A >: T](x: A): A = x 
} 

左右(編譯器推斷AAnyString這裏最近的共同祖先,這是Any

val cInt: C[Any] = new C[Int] 
cInt.m("123") // Any = 123 

SeqLike的定義:trait SeqLike[+A, +Repr],note +A