簡単に説明します。
クラスレベルで定義されたジェネリックは、(静的)メソッドレベルで定義されたジェネリックとは完全に異なります。
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
上記のコードがどこかにある場合、クラスレベルで定義されたTは、静的メソッドで定義されたTとは関係がないことに注意してください。次のコードも完全に有効で、上記のコードと同等です。
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
静的メソッドに、クラスのジェネリックとは異なる独自のジェネリックが必要なのはなぜですか?
これは、クラスをインスタンス化することなく静的メソッドを呼び出すことができるためです。したがって、クラスがまだインスタンス化されていない場合、Tが何であるかはまだわかりません。これが、静的メソッドが独自のジェネリックを持つ必要がある理由です。
したがって、静的メソッドを呼び出すときはいつでも、
Greet.sayHello("Bob");
Greet.sayHello(123);
JVMはそれを次のように解釈します。
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
どちらも同じ出力を与えます。
Hello Bob
Hello 123