아이템 23. 새 코드에는 무인자 자료형(raw type)을 사용하지 마라.
23. 새 코드에는 무인자 자료형(raw type)을 사용하지 마라.
private final Collection stamps = ....; // 무인자 자료형 사용 예
// 실수로 엉뚱한 자료형을 넣을 수 있음
stamps.add(new Coin(...));
for(Iterator i = stamps.iterator(); i.hasNext(); ){
// 무인자 자료형을 사용했기 때문에, cast를 해야 하고, 엉뚱한 데이터를 넣으면 ClassCastException예외가 발생함
Stamp s = (Stamp) i.next();
}
// 형인자 자료형을 사용하여 형 안정성(typesafe) 확보, 컴파일 타임에 바로 발견할수 있음
private final Collection<Stamp> stamps = ....;
용어 | 예 |
---|---|
형인자 자료형(parameterized type) | List<String> |
실 형인자(actual type parameter) | String |
제네릭 자료형(generic type) | List<E> |
형식 형인자(formal type parameter) | E |
비한정적 와일드 카드 자료형(unbounded wildcard type) | List<?> |
무인자 자료형(raw type) | List |
한정적 형인자(bounded type parameter) | <E extends Number> |
재귀적 형 한정(recursive type bound) | <T extends Comparable<T>> |
한정적 와일드카드 자료형(bounded wildcard type) | List<? extends Number> |
제네릭 메서드(generic method) | static <E> List<E> asList(E[] a) |
자료형 토큰(type token) | String.class |
List
vs List<Object>
List
는 형 검사 절차를 완전히 생략하지만, List<Object>
는 아무 객체나 List에 넣는 다는 것을 컴파일러가 인지함
예를 들어, List
에는 Object, String 등의 객체를 넣어도 컴파일러가 알수 없지만, List<Object>
에는 String을 넣으면 컴파일 에러가 발생한다.
제네릭에 대한 하위 자료형 정의 규칙에 따르면 List<String>
은 List
의 하위 자료형(sub type)이지만, List<Object>
의 하위 자료형이 아니기 때문이다.(규칙 25)