제네릭 타입 결정 시점

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)이다.