2016-08-21 6 views
0

ich für die Unterzeichnung des sorted Methode innerhalb des SeqLike Merkmal der Zweck nicht verstehen:Unterschrift sortiert Methode in SeqLike

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

Präziser, verstehe ich nicht:

  1. Der Grund für B>:A
  2. Was bedeutet Repr?

Vielleicht können Sie etwas Licht auf dieses Thema werfen.

Vielen Dank im Voraus für die Mühe bei der Beantwortung!

Antwort

2
  1. Die Methode verwendet eine implizite Ordering die in der Lage sein sollten einige geordneter Typ von A (daher B >: A) zu handhaben. I.e. Sie sollten Ordering[AnyVal] verwenden können, um Int Werte zu vergleichen (AnyVal ist ein Supertyp von Int).
  2. Repr ist ein Typparameter der SeqLike Eigenschaft selbst (SeqLike[+A, +Repr]) beschrieben als "der Typ der tatsächlichen Sammlung, die die Elemente enthält". Dies soll sicherstellen, dass Methoden wie sorted eine Sammlung desselben Typs zurückgeben (z. B. List.sorted wird immer noch eine List sein).

    Lassen Sie uns diese Klasse betrachten (nicht kompilieren): warum B >: A

+0

Ich verstehe immer noch nicht die Notwendigkeit für 1. Können Sie ein Beispiel dafür geben, warum ich in der Lage sein sollte, eine Bestellung [AnyVal] zu verwenden, um Int zu vergleichen, und nicht nur eine einfache Bestellung [Int]. Also unterzeichne ich das WAS, ich verstehe das WARUM nicht. – Adrian

+0

Danke für Punkt 2. obwohl, das ist jetzt klar! – Adrian

+0

Wenn Sie eine Bestellung [Tier] haben, sollten Sie in der Lage sein, eine Liste [Hund] zu sortieren. –

2

[B >: A] bedeutet, dass sorted kann mit jeder Ordnung auf B bezeichnet werden, wobei B ein übergeordneter Typ von A ist

Ich nehme A der Typ-Parameter des Merkmals selbst, dh

SeqLike ist definiert als SeqLike[A, This]. Um erschöpfend zu sein, wie SeqLike[A, +This <: SeqLike[A, This] with Seq[A]]. Die This <: SeqLike[A, This] ist F-beschränkter Polymorphismus.

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. 

Die actual return type of SeqLike.sorted ist This.

Dies ist nützlich, da SeqLike's Methoden nicht nur SeqLike s, sondern auch Subtypen zurückgeben können!

Gehen wir zurück zu den einfachen exemple früher ...

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

Ihre Antwort ist momentan zu kompliziert für mein Verständnis. Ich werde darauf zurückkommen, wenn sich mein Scala-Verständnis entwickelt. Bitte lesen Sie meinen Kommentar für Costi, um meine ursprüngliche Frage genauer zu verstehen. Vielen Dank!! Ich habe Sie aufgestockt, aber die Punkte sind wegen meiner begrenzten Geschichte und Reputation auf SO noch nicht sichtbar. – Adrian

+0

Kein Problem :-). Hoffentlich hilft es jemand anderem in der Zukunft! – Ven

0

Hier ist eine einfache Erklärung ist

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

+T bedeutet covariant, das heißt C[Any] ist eine übergeordnete Klasse von z.B. C[Int].Jetzt ("123" ist ein String, so ist es auch Any):

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

In Wirklichkeit:

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

so (Compiler folgert A wie die nächste gemeinsame Vorfahre von Any und String hier, das ist Any)

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

Definition von SeqLike: trait SeqLike[+A, +Repr], note +A