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

규칙 23. 새 코드에는 무인자 제네릭 자료형을 사용하지 마라. (154.p ~ 156.p)를 다시 한번 꼭 읽어 볼것!!!