2016-08-21 1 views
0

Je ne comprends pas le but de la signature de la méthode sorted dans le trait SeqLike:Signature de la méthode dans SeqLike triés

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

Plus précisément, je ne suis pas:

  1. La raison de B>:A
  2. Que signifie Repr?

Peut-être pouvez-vous nous éclairer à ce sujet.

Merci d'avance pour l'effort de réponse!

Répondre

2
  1. La méthode prend un Ordering implicite qui devrait être en mesure de traiter certains supertype de A (donc B >: A). C'est à dire. vous devriez pouvoir utiliser un Ordering[AnyVal] pour comparer Int valeurs (comme AnyVal est un supertype de Int).
  2. Repr est un paramètre de type du trait SeqLike lui-même (SeqLike[+A, +Repr]) décrit comme "le type de la collection réelle contenant les éléments". Ceci est destiné à garantir que des méthodes telles que sorted renverront une collection du même type (par exemple List.sorted sera toujours un List).
+0

Je ne comprends toujours pas le besoin de 1. Pouvez-vous donner un exemple de pourquoi je devrais être capable d'utiliser un Ordering [AnyVal] pour comparer Int et pas seulement un Ordering simple [Int]. Donc, je sous-entend le quoi, je ne comprends pas le pourquoi. – Adrian

+0

Merci pour le point 2. cependant, c'est clair maintenant! – Adrian

+0

Si vous avez une commande [Animal], vous devriez pouvoir trier une liste [Chien]. –

2

[B >: A] signifie que sorted peut être appelé avec toute commande sur B, où B est un supertype de A.

Je suppose que A est le paramètre de type de la caractéristique elle-même, à savoir

SeqLike est définie comme SeqLike[A, This]. Pour être exhaustif, comme SeqLike[A, +This <: SeqLike[A, This] with Seq[A]]. Le This <: SeqLike[A, This] est un polymorphisme à F-bounded.

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. 

Le actual return type of SeqLike.sorted est This.

Ceci est utile, car cela permet aux méthodes de SeqLike de renvoyer non seulement SeqLike s, mais aussi des sous-types!

Pour revenir à l'exemple simple, plus tôt ...

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

Votre réponse est momentanément trop compliquée pour mon niveau de compréhension. J'y reviendrai quand ma compréhension Scala évoluera. S'il vous plaît voir mon commentaire pour Costi pour comprendre ma question initiale plus en détail. Merci!! Je vous ai upvoted mais les points ne sont pas encore visibles en raison de mon histoire limitée et de ma réputation sur SO. – Adrian

+0

Pas de problème :-). J'espère que ça va aider quelqu'un d'autre dans le futur! – Ven

0

Voici une explication simple B >: A:

Considérons cette classe (ne compile pas):

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

+T signifie covariant, à savoir C[Any] est une superclasse de par exemple C[Int].Maintenant ("123" est un String, il est donc aussi Any):

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

En réalité:

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

donc (compilateur infère A comme l'ancêtre commun le plus proche de Any et String ici, qui est Any)

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

Définition de SeqLike: trait SeqLike[+A, +Repr], note +A