Tôi sẽ giải thích nó một cách đơn giản.
Các tướng được định nghĩa ở cấp Lớp hoàn toàn tách biệt với các tổng quát được định nghĩa ở cấp phương thức (tĩnh).
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
Khi bạn thấy mã ở trên ở bất cứ đâu, xin lưu ý rằng T được xác định ở cấp lớp không liên quan gì đến T được xác định trong phương thức tĩnh. Đoạn mã sau cũng hoàn toàn hợp lệ và tương đương với đoạn mã trên.
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
Tại sao phương thức tĩnh cần có các tổng quát riêng của nó tách biệt với các tổng quát của Lớp?
Điều này là do, phương thức tĩnh có thể được gọi mà không cần khởi tạo Class. Vì vậy, nếu Lớp chưa được khởi tạo, chúng ta chưa biết T. là gì, đây là lý do tại sao các phương thức tĩnh cần phải có tổng quát riêng.
Vì vậy, bất cứ khi nào bạn đang gọi phương thức tĩnh,
Greet.sayHello("Bob");
Greet.sayHello(123);
JVM diễn giải nó như sau.
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Cả hai đều cho cùng một đầu ra.
Hello Bob
Hello 123