J'ai quelques questions à propos de Java générique de caractères génériques:
quel est la différence entre
List<? extends T>
etList<? super T>
Ce qui est bornée générique et qu'est ce qu'une surabondance de générique?
J'ai quelques questions à propos de Java générique de caractères génériques:
quel est la différence entre
List<? extends T>
et
List<? super T>
Ce qui est bornée générique et qu'est ce qu'une surabondance de générique?
Dans votre première question, <? extends T>
et <? super T>
sont des exemples de délimité les caractères génériques. Une vive générique ressemble <?>
, et signifie fondamentalement <? extends Object>
. Il vaguement signifie que le générique peut être n'importe quel type. Bornée générique (<? extends T>
ou <? super T>
) impose une restriction sur le type en lui disant qu'il a à étendre un type spécifique (<? extends T>
qui est connu comme une limite supérieure), ou doit être un ancêtre d'un type spécifique (<? super T>
qui est connu comme une limite inférieure).
La Java des Tutoriels ont des très bonnes explications des génériques dans les articles , les Jokers et Plus de Plaisir avec des caractères génériques.
Si vous avez une hiérarchie de classe A, B est une sous-classe de A, et C et D, les deux sont sous-classe de B comme ci-dessous
class A {}
class B extends A {}
class C extends B {}
class D extends B {}
Alors
List<? extends A> la;
la = new ArrayList<B>();
la = new ArrayList<C>();
la = new ArrayList<D>();
List<? super B> lb;
lb = new ArrayList<A>(); //fine
lb = new ArrayList<C>(); //will not compile
public void someMethod(List<? extends B> lb) {
B b = lb.get(0); // is fine
lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B
}
public void otherMethod(List<? super B> lb) {
B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A
lb.add(new B()); // is fine, as we know that it will be a super type of A
}
Bornée joker, c'est comme ? extends B
où B est un certain type. C'est le type est inconnu, mais un "lié" peut être placé sur elle. Dans ce cas, il est délimité par un peu de classe, qui est une sous-classe de B.
Josh Bloch a aussi une bonne explication de quand utiliser super
et extends
dans ce google io présentation vidéo où il mentionne le Producteur extends
Consommation super
mnémonique.
À partir de la présentation de diapositives:
Supposons que vous souhaitez ajouter en vrac méthodes d'
Stack<E>
void pushAll(Collection<? extends E> src);
– src est un E producteur
void popAll(Collection<? super E> dst);
– l'heure d'été est un E consommateurs
Vous pouvez trouver mon tutoriel sur ce sujet beaucoup plus profond et utile.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.