我不明白SeqLike
特質中的sorted
方法的簽名目的:簽名分類方法的
def sorted[B >: A](implicit ord: Ordering[B]): Repr
更精確,我不明白:
- 原因
B>:A
Repr
是什麼意思?
也許你可以對此有所瞭解。
在此先感謝您的回答!
我不明白SeqLike
特質中的sorted
方法的簽名目的:簽名分類方法的
def sorted[B >: A](implicit ord: Ordering[B]): Repr
更精確,我不明白:
B>:A
Repr
是什麼意思?也許你可以對此有所瞭解。
在此先感謝您的回答!
Ordering
應該能夠處理一些超的A
(因此B >: A
)。即您應該可以使用Ordering[AnyVal]
來比較Int
值(因爲AnyVal
是超類型Int
)。Repr
是描述爲「包含元素的實際集合的類型」的SeqLike
特徵本身的類型參數(SeqLike[+A, +Repr]
)。這是爲了確保像sorted
這樣的方法將返回相同類型的集合(例如List.sorted
仍然是List
)。[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.sorted
是This
。
這很有用,因爲這使得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.
下面是一個簡單的解釋,爲什麼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
}
左右(編譯器推斷A
爲Any
和String
這裏最近的共同祖先,這是Any
)
val cInt: C[Any] = new C[Int]
cInt.m("123") // Any = 123
SeqLike
的定義:trait SeqLike[+A, +Repr]
,note +A
我還是不明白1的必要性。你能給我一個例子,說明爲什麼我應該能夠使用Ordering [AnyVal]來比較Int,而不僅僅是一個簡單的Ordering [Int]。所以,我沒有理解什麼,我不明白爲什麼。 – Adrian
感謝第2點。不過,現在已經很清楚了! – Adrian
如果您有訂購[動物],您應該可以對列表[狗]進行排序。 –