Ich werde es auf einfache Weise erklären.
Auf Klassenebene definierte Generika sind vollständig von den auf (statischer) Methodenebene definierten Generika getrennt.
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
Wenn Sie den obigen Code irgendwo sehen, beachten Sie bitte, dass das auf Klassenebene definierte T nichts mit dem in der statischen Methode definierten T zu tun hat. Der folgende Code ist ebenfalls vollständig gültig und entspricht dem obigen Code.
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
Warum muss die statische Methode ihre eigenen Generika haben, die von denen der Klasse getrennt sind?
Dies liegt daran, dass die statische Methode aufgerufen werden kann, ohne die Klasse zu instanziieren. Wenn die Klasse noch nicht instanziiert ist, wissen wir noch nicht, was T ist. Dies ist der Grund, warum die statischen Methoden ihre eigenen Generika haben müssen.
Wenn Sie also die statische Methode aufrufen,
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM interpretiert es wie folgt.
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Beide geben die gleichen Ausgänge.
Hello Bob
Hello 123