JAVA · 람다/메서드
타입 이레이저(Type Erasure)
컴파일 후 제네릭 타입 정보가 소거되는 원리와 그 영향을 이해합니다.
람다/메서드고급type-erasure타입이레이저제네릭리플렉션
핵심 설명
컴파일 후 제네릭 타입 정보가 소거되는 원리와 그 영향을 이해합니다.
Java code
import java.util.*;
import java.lang.reflect.*;
public class TypeErasure {
// 컴파일 후: List list (타입 정보 소거)
static <T> void printList(List<T> list) {
for (T item : list) {
System.out.println(item);
}
}
// 타입 이레이저 때문에 오버로드 불가
// void process(List<String> list) {}
// void process(List<Integer> list) {} // 컴파일 에러!
// 우회: 타입 토큰 패턴
static <T> List<T> createList(Class<T> type, int size) {
List<T> list = new ArrayList<>();
System.out.println("타입: " + type.getName());
return list;
}
// 리플렉션으로 제네릭 타입 정보 확인 (필드/파라미터)
List<String> stringField;
public static void main(String[] args) throws Exception {
// 런타임에 제네릭 타입 확인 불가
List<String> strs = new ArrayList<>();
List<Integer> nums = new ArrayList<>();
System.out.println(strs.getClass() == nums.getClass()); // true!
// 필드의 제네릭 타입은 리플렉션으로 확인 가능
Field f = TypeErasure.class.getDeclaredField("stringField");
ParameterizedType pt = (ParameterizedType) f.getGenericType();
System.out.println(pt.getActualTypeArguments()[0]); // String
}
}학습 팁
타입 토큰(Class<T>)이나 Super Type Token 패턴으로 런타임에 타입 정보를 전달할 수 있습니다.
주의할 점
new T(), new T[], instanceof T는 타입 이레이저 때문에 불가능합니다. Class<T>를 전달받아 사용하세요.
자주 묻는 질문
타입 이레이저(Type Erasure)란 무엇인가요?
컴파일 후 제네릭 타입 정보가 소거되는 원리와 그 영향을 이해합니다.
타입 이레이저(Type Erasure) 학습 시 주의할 점은 무엇인가요?
new T() , new T[] , instanceof T 는 타입 이레이저 때문에 불가능합니다. Class<T> 를 전달받아 사용하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.