78 votes

Qu'est-ce qu'un exemple réel de générique<? super T> ?

Je comprends que <? super T> représente n'importe quelle super classe de T (classe parent de T de n'importe quel niveau). Mais j'ai vraiment du mal à imaginer un exemple réel pour ce joker générique lié.

Je comprends ce que signifie <? super T> et j'ai vu cette méthode:

 public class Collections {
  public static <T> void copy(List<? super T> dest, List<? extends T> src) {
      for (int i = 0; i < src.size(); i++)
        dest.set(i, src.get(i));
  }
}

Je recherche un exemple de cas d'utilisation réel où cette construction peut être utilisée et non une explication de ce que c'est.

15voto

Benoit Points 2443

Supposons que vous ayez cette hiérarchie de classes: Cat hérite de Mammal, qui à son tour hérite d'Animal.

 List<Animal> animals = new ArrayList<>();
List<Mammal> mammals = new ArrayList<>();
List<Cat> cats = ...

Ces appels sont valides:

 Collections.copy(animals, mammals); // all mammals are animals
Collections.copy(mammals, cats);    // all cats are mammals
Collections.copy(animals, cats);    // all cats are animals
Collections.copy(cats, cats);       // all cats are cats 

Mais ces appels ne sont pas valides:

 Collections.copy(mammals, animals); // not all animals are mammals
Collections.copy(cats, mammals);    // not all mammals are cats
Collections.copy(cats, animals);    // mot all animals are cats

Ainsi, la signature de méthode garantit simplement que vous copiez d'une classe plus spécifique (inférieure dans la hiérarchie d'héritage) vers une classe plus générique (supérieure dans la hiérarchie d'héritage), et non l'inverse.

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