127 votes

Java Génériques (Jokers)

J'ai quelques questions à propos de Java générique de caractères génériques:

  1. quel est la différence entre List<? extends T> et List<? super T>

  2. Ce qui est bornée générique et qu'est ce qu'une surabondance de générique?

138voto

Bill the Lizard Points 147311

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.

55voto

oxbow_lakes Points 70013

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.

39voto

blank Points 7947

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

7voto

Ted Gao Points 81

Vous pouvez trouver mon tutoriel sur ce sujet beaucoup plus profond et utile.

Prograide.com

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.

Powered by:

X