간단한 방법으로 설명하겠습니다.
클래스 수준에서 정의 된 제네릭은 (정적) 메서드 수준에서 정의 된 제네릭과 완전히 분리됩니다.
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