← 질문 목록
#67깊이 0
서로 다른 List 타입 인자는 런타임에 남는가?
객체 자체에는 보통 남지 않는다. 컴파일러가 타입 안전성을 검사한 뒤 타입 인자를 소거한다. 문자열 List와 정수 List는 런타임에 같은 클래스다.
| 기준 | 컴파일 시점 | 런타임 |
|---|---|---|
| 타입 인자 | 검사한다 | 객체에는 없다 |
| 형변환 | 필요한 곳에 삽입한다 | 실행 중 검사한다 |
소거 뒤 오버라이딩 시그니처가 달라질 수 있다. 컴파일러는 다형성을 유지하려고 합성 브리지 메서드를 만든다.
타입 변수의 직접 인스턴스화와 배열 생성은 제한된다. 구체 타입 인자를 붙인 타입을 instanceof로 검사하거나 소거형이 같은 메서드를 오버로드할 수도 없다.
다만 필드와 메서드 선언의 제네릭 시그니처는 클래스 파일에 남을 수 있다. 리플렉션은 그 선언 정보를 읽지만 객체의 실제 타입 인자를 복원하지는 못한다.