제네릭을 만들 때 그 당시 여유상황이 별로 없었기 때문에 타입 소거 방식의 제네릭을 택했기 때문.


타입 소거 방식 때문에 컴파일 이후 자바 제네릭은 그 타입을 잃어 버리고 원시타입이 됨.

ArrayList<Integer>,

ArrayList<String> 가 컴파일 후 ArrayList 가 된다는 것.

그렇기 때문에 메서드 오버로딩에서 ArrayList<Integer> 와 ArrayList<String> 를 하면 컴파일 에러 발생.

왜? 어차피 같은 Array 원시타입이거든


타입 소거의 가장 큰 문제점은 성능이 별로 좋지 않다는 것.


ArrayList<int>, ArrayList<long> 이런게 자바에서 없는 이유,

자바는 본질적으로 int, Object 사이 직접적인 형 변환 지원 안함.

타입 소거로 타입을 없애버리면 형 변환 코드로 답이 안나온다는 말임.


어케할까 고민하다 싸지른게 ArrayList<Integer>, ArrayList<Long> 이렇게 래퍼객체를 쓰자 였음.

사용자는 타이핑 좀 더 하는거말고 불편함 못느낌

그런데 뒷단에선 배열 하나 생성할 때마다 존나 많은 래퍼클래스 + 박싱,언박싱 콤보를 처맞게됨.


List<Integer> list = new ArrayList<>();

list.add(10) -> 자동 박싱

int value = list.get(0) -> 자동 언박싱


그래서 성능이 진짜 제네릭을 구현한 여타 언어(C#) 보다 구려질수밖에