Saya akan menjelaskannya dengan cara yang sederhana.
Generik yang didefinisikan pada level Kelas sepenuhnya terpisah dari generik yang didefinisikan pada level metode (statis).
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
Ketika Anda melihat kode di atas di mana saja, harap dicatat bahwa T yang didefinisikan di tingkat kelas tidak ada hubungannya dengan T yang didefinisikan dalam metode statis. Kode berikut ini juga sepenuhnya valid dan setara dengan kode di atas.
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
Mengapa metode statis perlu memiliki generiknya sendiri yang terpisah dari kelas?
Ini karena, metode statis dapat dipanggil tanpa bahkan instantiating Kelas. Jadi jika Kelas belum dipakai, kita belum tahu apa itu T. Ini adalah alasan mengapa metode statis perlu memiliki generiknya sendiri.
Jadi, setiap kali Anda memanggil metode statis,
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM mengartikannya sebagai berikut.
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Keduanya memberikan output yang sama.
Hello Bob
Hello 123