제네릭 타입 결정 시점
2025. 6. 26. 11:23ㆍ에러
현상
제네릭 관련해서 값이 기대한대로 나오지 않는 문제가 있었다.
new Data<>("AAA").print();
public class Data<T> {
T value;
public Data(T t) {
value = t;
}
public void print() {
new Printer().print(value);
}
}
public class Printer {
void print(Object a) {
System.out.println("object : " + a);
}
void print(String a) {
System.out.println("String : " + a);
}
}
제네릭 T 가 String이기 때문에 print(String a) 가 실행될거라고 예상했었지만
결과는 print(Object a)가 실행됐다.
원인
원인은 오버로딩은 컴파일시점에 결정이 되기 때문이었다.
Data<T> 클래스를 컴파일 하는 과정에서 T value는 Object이다.
그래서 컴파일된 코드는 Printer 클래스의 print(Object a)이다.
런타임도중 T value가 String이 되어도 ,
컴파일된 print()메소드는 이미 print(Object a) 이기 때문에
Data<> 에서 실행한 Printer의 print()는 항상 print(object a)이다.