배열 VS 리스트
배열은 하위타입을 허용하지만 리스트 제네릭 타입은 허용하지 않는다. - 배열: 런타임 에러, 리스트: 컴파일 에러
Object[] objArray = new Long[1]; // 컴파일 됨
objArray[0] = "스트링 넣어볼까" // 런타임 에러
List<Object> ol = new ArrayList<Long>(); // 컴파일 에러
배열은 런타임에 실체화되지만 리스트는 실체화 불가 타입이다.
배열은 런타임에 타입을 갖고 그에 따라 형변환된다.
리스트는 런타임에 제네릭이 소거된다. (List<?> 는 실체화 될 수 있다.)
따라서 둘을 혼용하면 예상치 못한 런타임 에러를 맞이할 확률이 높아진다.
제네릭 배열 생성 오류나 비검사 형변환 경고는 E[] 를 List<E> 로 바꾸기만 해도 해결된다. (물론 약간의 성능 저하와 코드 복잡도가 증가할 수는 있다.)