Déclaration de méthode générique Java [dupliquer]

Cette question a déjà une réponse ici:

J'apprends les génériques Java et je me pose cette question.

Quelle est la différence entre ces deux déclarations de méthode?

public static void someMethod(List<? extends Number> numberList);

Et

public static <E extends Number> void someMethod(List<E> numberList);
29
demandé sur Smi 2013-02-20 15:59:23

4 réponses

Dans ce dernier, vous avez une référence au type dans la portée de someMethod, à savoir E. Dans le premier, vous ne le faites pas.

20
répondu Rich O'Kelly 2013-02-20 12:02:23

La principale différence est que ce dernier est un méthode générique, l'ancien ne l'est pas.

Par exemple, dans cette dernière méthode, vous pouvez faire quelque chose comme ceci:

public static <E extends MyObject> void someMethod(List<E> someList) {
    E myObject = someList.iterator().next(); // this can actually lead to errors
    myObject.doSomething();                  // so treat it as an example
}

Cela signifie que vous pouvez remplacer un type arbitraire E qui est conforme à la règle dans la déclaration de méthode générique et être capable d'utiliser ce type dans votre méthode.

Sachez cependant que vous devez appeler la méthode générique avec des arguments de type comme ceci:

someClass.<MyArbitraryType>someMethod(someList);

Vous pouvez trouver une belle vue d'ensemble de méthodes génériques ici.

9
répondu Adam Arold 2013-02-20 12:19:08

, Avec la deuxième version, vous pouvez faire quelque chose comme:

public static <E extends Number> void someMethod(List<E> numberList) {
  E number = numberList.get(0); 
  numberList.add(number);
}

Ce n'est pas possible avec la première version.

4
répondu Landei 2013-02-20 12:09:15

L'utilisation de la première déclaration de méthode ne vous permettra pas d'ajouter quelque chose de nouveau à la liste. Par exemple, cela ne compilera pas.

public static void someMethod(List<? extends Number> numberList, Number number) {
    numberList.add(number);
}

Alors que la seconde vous permet de faire ceci:

public <T extends Number> static void someMethod(List<T> numberList, T number) {
    numberList.add(number);
}
0
répondu Denis Rosca 2013-02-20 12:26:29