배열과 제네릭 타입에는 중요한 차이가 두 가지 있다. 첫번째, 배열은 공변이다.(공변 - 함께 변한다는 뜻) Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 반면 제네릭은 불공변이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도, 상위 타입도 아니다. 이것만 보면 제네릭에 문제가 있다고 생각할 수 있지만 문제가 있는 건 배열 쪽이다. 배열은 런타임 시점에, 제네릭은 컴파일 시점에 문제를 발견할 수 있기 때문이다. 두번째, 배열은 실체화된다. 배열은 런타임에도 자신이 담기로 한 원소의 타입을 인지하고 확인한다. 그렇기 때문에 런타임 시점에 문제가 발견되는 것이다. 반면에 제네릭은 타입 정보가 런타임에는 소거된다...