Je vais l'expliquer d'une manière simple.
Les génériques définis au niveau de la classe sont complètement séparés des génériques définis au niveau de la méthode (statique).
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
Lorsque vous voyez le code ci-dessus n'importe où, veuillez noter que le T défini au niveau de la classe n'a rien à voir avec le T défini dans la méthode statique. Le code suivant est également entièrement valide et équivalent au code ci-dessus.
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
Pourquoi la méthode statique doit-elle avoir ses propres génériques séparés de ceux de la classe?
En effet, la méthode statique peut être appelée sans même instancier la classe. Donc, si la classe n'est pas encore instanciée, nous ne savons pas encore ce qu'est T. C'est la raison pour laquelle les méthodes statiques doivent avoir leurs propres génériques.
Ainsi, chaque fois que vous appelez la méthode statique,
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM l'interprète comme suit.
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Les deux donnant les mêmes sorties.
Hello Bob
Hello 123