Basit bir şekilde açıklayacağım.
Sınıf düzeyinde tanımlanan jenerikler (statik) yöntem seviyesinde tanımlanan jeneriklerden tamamen farklıdır.
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
Yukarıdaki kodu herhangi bir yerde gördüğünüzde, sınıf düzeyinde tanımlanan T'nin statik yöntemde tanımlanan T ile hiçbir ilgisi olmadığını lütfen unutmayın. Aşağıdaki kod da tamamen geçerlidir ve yukarıdaki koda eşdeğerdir.
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
Statik yöntemin neden kendi jeneriklerinin Sınıfdakilerden ayrı olması gerekir?
Bunun nedeni, Statik yöntem Sınıfı örneklemeden bile çağrılabilir. Eğer Sınıf henüz somutlaştırılmamışsa, T'nin ne olduğunu henüz bilmiyoruz. Bu, statik yöntemlerin kendi jeneriklerine sahip olmasının nedenidir.
Yani, statik yöntemi her çağırdığınızda,
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM bunu aşağıdaki gibi yorumlar.
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Her ikisi de aynı çıktıları veriyor.
Hello Bob
Hello 123