Quelle est la différence entre:Différence entre SomeClass <T étend AutreClasse> et SomeClass <T super AutreClasse>
SomeClass<T extends OtherClass>
et
SomeClass<T super OtherClass>
Quelle est la différence entre:Différence entre SomeClass <T étend AutreClasse> et SomeClass <T super AutreClasse>
SomeClass<T extends OtherClass>
et
SomeClass<T super OtherClass>
Sun dit (de Using and Programming Generics in J2SE 5.0)
Il existe trois types de caractères génériques:
- "étend Type?": Indique une famille de sous-types de type de type. Ceci est le caractère générique
- "super type?" Le plus utile: Signifie une famille de super-types de type de type
- "?": 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.
+1 pour l'exemple Stack. – Grundlefleck
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>
.
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>
.
rien de ceci est une syntaxe valide – newacct
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
T
Foo<? extends T>
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.
double http://stackoverflow.com/questions/1910892/what-is-the-difference-between-super-and-extends-in-java-generics – Bozho
il n'y a pas 'SomeClass ' –
newacct