2009-12-20 10 views

Répondre

4

Sun dit (de Using and Programming Generics in J2SE 5.0)

Il existe trois types de caractères génériques:

  1. "étend Type?": Indique une famille de sous-types de type de type. Ceci est le caractère générique
  2. "super type?" Le plus utile: Signifie une famille de super-types de type de type
  3. "?": Désigne l'ensemble de tous les types ou tout

More Fun with Wildcards donne une bonne exemples à tous les trois types.


Un autre bon exemple (extrait de la vidéo recommandée par @Adrian) est:

class Stack<E> { 
    void pushAll(Collection<? extends E> src); 
    void popAll(Collection<? super E> dest); 
} 

Ici vous pouvez voir la différence entre super et extends:

Pour la méthode pushAll vous imaginez avoir un Stack<Number>. Vous voulez pousser tous les éléments de src vers le Stack. Mais src devrait pouvoir être un Collection<Integer>. C'est pourquoi vous choisissez ? extends E ici. Pour la méthode popAll, imaginez que vous avez un Stack<Integer>. Vous voulez afficher tous les éléments de Stack à dest. Mais dest devrait pouvoir être un Collection<Number>. C'est pourquoi vous choisissez ? super E ici.

+0

+1 pour l'exemple Stack. – Grundlefleck

0
  • Dans le premier cas, AutreClasse et tout la sous-classe est applicable en tant que paramètre de type. Ceci est utile pour les collections, où vous souhaitez limiter les éléments à Figure (y compris Rectangle et Circle) mais pas aux autres objets qui ne sont pas des figures. Ainsi, nous limitons la collection à Group<? extends Figure>.

  • Dans ce dernier cas, OtherClass et toute superclasse sont applicables en tant que paramètre de type. Ceci est utile si vous avez besoin de passer un Comparator à une collection de chiffres: ce comparateur doit seulement supposer que les éléments sont des chiffres ou plus généraux. Les comparateurs qui s'attendaient à ce que chaque objet soit Object ou Figure fonctionneront, mais un comparateur qui suppose que tous les éléments sont Rectangle échouera s'il rencontre par exemple un Circle. Nous limitons donc le comparateur à Comparator<? super Figure>.

1

La différence réside dans la réponse à la question "Quels types sont des sous-types de SomeClass?". C'est évidemment une question intéressante en Java car une grande partie de la puissance du langage vient de la capacité de substituer des sous-types. Maintenant, avec

SomeClass<T extends OtherClass> 

les sous-types sont tous ceux SomeClass<S> où S est un sous-type de T. Par exemple, les sous-types de

SomeClass<T extends List> 

comprennent SomeClass <LinkedList> et SomeClass <ArrayList>. Mais avec

SomeClass<T super OtherClass> 

les sous-types sont tous ceux SomeClass<S> où S est un supertype de T. Par exemple, les sous-types de

SomeClass<T super LinkedList> 

comprennent SomeClass<List> et SomeClass<Collection>.

+0

rien de ceci est une syntaxe valide – newacct

1

La réponse de tangens est correcte, ceci est juste (peut-être) une information utile pour accompagner cette réponse.

Il existe une bonne explication de l'utilisation des deux jokers différents dans Effective Java 2nd Edition de Josh Bloch. Il est également décrit dans la vidéo this.

Un mnémonique qu'il utilise est PECS - Producer Extends, Consumer Super. Ceci est expliqué dans la vidéo et le livre. Ceci est une paraphrase de l'une des diapositives utilisées dans le discours:


PECS - Producteur extends Consommateur super

  • Pour un usage producteur TFoo<? extends T>
  • Pour une utilisation T des consommateurs Foo<? super T>

Ceci s'applique uniquement au paramètre d'entrée s, n'utilisez pas les types génériques comme types de retour.


Questions connexes