정리

클래스와 인터페이스선언에 타입매개변수 가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다.

각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 제네릭 타입을 하나 정의 하면 그에 딸린 로타입도 함께 정의 된다. 로 타입이란 제네릭타입에서 타입 매개변수를 전혀 사용하지 않았을 때를 말한다. 예컨다 List의 로타입은 List 이다.

로타입을 쓰면 제네릭이 안겨주는 안전성과 표현력을 모두 읽게 된다.

제네릭 타입을 쓰고 싶지만 실제 타입 매개변수가 무엇인지 신경쓰고 싶지 않다면 물음표(?)를 사용하자. 예컨데, 제네릭 타입인 Set의 비한정적 와잍드 카드 타입은 Set<?> 이다. Set<?> 와 Set의 차이는 : 와일드카드 타입은 안전하고, 로 타입은 안전하지 않다.

로 타입컬렉션에는 아무 원소나 넣을 수 있으니 타입 불변식을 훼손하기 쉽다. 반면 Collection<?> 에는 null 외에는 어떤 원소도 넣을 수 없다.

소소한 예외

  • class 리터럴에는 로타입을 써야한다.
  • instanceof 연산사의 경우 로타입을 사용하는 편이 깔끔하다.

핵심정리

로 타입을 사용하면 런타임에 예외가 일어날 수 있으니 사용하면 안된다. 로타입은 제네릭이 도입되기 이전 코드와의 호환성을 위해 제공될 뿐이다. 빠르게 훑어보자면, Set 는 어떤 타입의 객체도 저장할 수 있는 매개변수 타입이고, Set<?> 는 모종의 타입객체만 저장할 수 있는 와일드 카드 타입이다. 그리고 이들의 로타입인 Set 는 제네릭 타입 시스템에 속하지 않는다. Set 와 Set<?>는 안전하지만 로타입인 Set 는 안전하지 않다.