Je lis sur les méthodes génériques d' OracleDocGenericMethod . Je suis assez confus au sujet de la comparaison quand il dit quand utiliser des caractères génériques et quand utiliser des méthodes génériques. Citant le document.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Nous aurions pu utiliser des méthodes génériques ici à la place:
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] Cela nous indique que l'argument type est utilisé pour le polymorphisme; son seul effet est de permettre l'utilisation d'une variété de types d'arguments réels sur différents sites d'invocation. Si tel est le cas, il faut utiliser des caractères génériques. Les caractères génériques sont conçus pour prendre en charge le sous-typage flexible, ce que nous essayons d'exprimer ici.
Ne pensons-nous pas que les caractères génériques (Collection<? extends E> c);
soutiennent également une sorte de polymorphisme? Alors pourquoi l'utilisation de méthodes génériques n'est-elle pas considérée comme bonne dans ce domaine?
Continuant de l'avant, il déclare,
Les méthodes génériques permettent d'utiliser des paramètres de type pour exprimer des dépendances entre les types d'un ou plusieurs arguments d'une méthode et / ou de son type de retour. S'il n'y a pas une telle dépendance, une méthode générique ne doit pas être utilisée.
Qu'est-ce que ça veut dire?
Ils ont présenté l'exemple
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[…]
Nous aurions pu écrire la signature de cette méthode d'une autre manière, sans utiliser du tout de jokers:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
Le document décourage la deuxième déclaration et encourage l'utilisation de la première syntaxe? Quelle est la différence entre la première et la deuxième déclaration? Les deux semblent faire la même chose?
Quelqu'un peut-il éclairer ce domaine.
?
. Vous pouvez le réécrire comme `public static <T1 étend le nombre, T2 étend le nombre> copie vide (List <T1> dest, List <T2> src) et dans ce cas, ce qui se passe devient évident.