아이템 28 - 배열보다는 리스트를 사용하라
JAVA ·배열과 제네릭은 잘 어울리지 않는다.
- 첫 번째 차이, 배열은 공변(covariant), 제네릭은 불공변
- Sub가 Super의 하위타입이라면 배열 Sub[]은 Super[]의 하위 타입이 된다.
- List< Sub >은 List< Super >의 하위 타입이 아니다.
- 두 번째 차이, 배열은 런타임에 실체화(reify) 되지만, 제네릭은 실체화 되지 않는다. (소거)
- 제네릭은 원소 타입을 컴파일타임에만 검사하며 런타임에는 알 수조차도 없다.
- 배열은 제네릭 타입, 매개변수화 타입, 타입 매개변수로 사용할 수 없다.
- new List< E >[], new List< String >[], new E[] 식으로 작성하면 컴파일할 때 제네릭 배열 생성 오류를 일으킨다.
- 제네릭 배열을 만들지 못하게 막은 이유는 타입 안전하지 않기 때문이다.
- 이를 허용한다면 컴파일러가 자동 생성한 형변환 코드에서 런타임에 ClassCastException이 발생할 수 있다.
- 런타임에 ClassCastException이 발생하는 일을 막아주겠다는 제네릭 타입 시스템의 취지에 어긋난다.
- 배열로 형변환할 때 제네릭 배열 생성 오류나 비검사 형변환 경고가 뜨는 경우 대부분은 배열인 E[] 대신 컬렉션인 List< E >를 사용하면 해결된다.
- 코드가 조금 복잡해지고 성능이 살짝 나빠질 수도 있지만, 그 대신 타입 안전성과 상호운용성은 좋아진다.