2016-08-21 2 views
0

Я не понимаю, цель для подписи метода sorted в пределах SeqLike признака:Подпись отсортированных метода в SeqLike

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

Если у вас есть заказ [Animal], вы можете отсортировать List [Dog]. –

2

[B >: A] означает, что sorted можно назвать с любым порядком на B, где B является супертипом А.

Я полагаю, А параметр типа самого признака, т.е.

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 с, но и подтипы!

Возвращаясь к простому Exemple раньше ...

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

Ваш ответ на мгновение слишком сложный для моего уровня понимания. Я вернусь к нему, когда мое понимание Скалы будет развиваться. Пожалуйста, см. Мой комментарий для Кости, чтобы понять мой первоначальный вопрос более подробно. Благодаря!! Я поддержал вас, но точки еще не видны из-за моей ограниченной истории и репутации на 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 
} 

так (компилятор выводит A как ближайший общий предок Any и String здесь, что Any)

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

Определение SeqLike: trait SeqLike[+A, +Repr], note +A