PHpullh
학습 라이브러리/Java/타입 이레이저(Type Erasure)

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&lt;T&gt; 를 전달받아 사용하세요.