public class AAA<T>{

...

}


public class BBB<T>{

T[] arr1;

AAA<T>[] arr2;


public BBB(){

arr1 = new T+; ← ① 컴파일 X

arr1 = (T[]) new Object+;  ②

arr2 = (AAA<T> []) new Object+;  ③ 런타임 X (ClassCastException)

arr2 = (AAA<T> []) new AAA+; ← ④

}


...

}

-----------------------------------------------------------------------------------------------


이유는 잘 모르겠지만 자바가 을 막아놔서 T 배열을 만들려면 ②처럼 해야 된다고 알고 있음. 




일단 나는 ②는 이렇게 이해했음.


--------------------------------------------------------------------------------

런타임에 ②가 타입 소거로 인해


(T[]) new Object+ → (Object[]) new Object+ 가 된다.


Object[] 객체를 Object[]로 cast 하는 거니까 문제 없이 잘 수행된다.

--------------------------------------------------------------------------------




③도 비슷하게 이해했음.


--------------------------------------------------------------------------------

런타임에 ③이 타입 소거로 인해


(AAA<T> []) new Object+ → (AAA<Object> []) new Object+ 가 된다.


이건 Object[] 객체를 AAA<Object>[]로 cast 하는 거니까 예외가 발생한다.

--------------------------------------------------------------------------------



근데 이런 식으로 이해하고 나니까 ④가 왜 되는 건지 설명이 안됨.


검색해보니까 AAA가 raw type 이라고 하는데 그러면 AAA랑 AAA<Object>는 다른 거 아닌가?


그냥 내가 타입 소거를 완전히 잘못 이해하고 있는 건가?