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>는 다른 거 아닌가?
그냥 내가 타입 소거를 완전히 잘못 이해하고 있는 건가?
다형성 눈에안보이지만 모든 객체는 오브젝트를 상속함 이었나 그랬던거같은데