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>를 사용하면 해결된다.