아이템 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)