ฉันจะอธิบายอย่างง่าย ๆ
ยาสามัญที่กำหนดในระดับ Class จะแยกจากยาชื่อสามัญที่กำหนดในระดับวิธี (แบบคงที่)
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);
}
}
ทำไมวิธีการแบบคงที่จำเป็นต้องมี generics ของตัวเองแยกต่างหากจากระดับ
นี่เป็นเพราะวิธีการคงที่สามารถเรียกได้โดยไม่ต้องยกระดับแม้กระทั่ง ดังนั้นถ้า Class ยังไม่ถูกสร้างอินสแตนท์เราไม่ทราบว่า T คืออะไรนี่คือเหตุผลว่าทำไมเมธอดสแตติกจำเป็นต้องมี generics ของตัวเอง
ดังนั้นทุกครั้งที่คุณเรียกใช้เมธอดสแตติก
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM ตีความมันดังต่อไปนี้
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
ทั้งสองให้ผลลัพธ์เดียวกัน
Hello Bob
Hello 123