Sub
가 Super
의 하위 타입이라면 배열 Sub[]
는 Super[]
의 하위타입이 된다.List<Super>
는 List<Sub>
의 상위 타입도, 하위 타입도 아니다.이런 이유 때문에 배열에선 타입이 안맞으면 런타임에 예외를 던지지만 제네릭을 사용하는 리스트에선 컴파일조차 되지 않는다.
// 런타임에 실패하는 코드
Object[] objects = new Long[1];
objects[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException 발생
// 컴파일조차 되지 않는 코드
List<Object> ol = new ArrayList<Long>(); // 호환되지 않는 타입, 컴파일 에러!
new List<E>[]
, new List<String>[]
, new E[]
는 컴파일 오류ClassCastException
이 발생할 수 있다.E
, List<E>,
List<String>
같은 타입을 실체화 불가 타입이라 한다.
List<?>
와 Map<?, ?>
와 같은 비한정적 와일드카드 타입은 실체화될 수 있다.List<E>
를 사용하면 해결된다.