로 타입은 사용하지 말라.
effective
정리
클래스와 인터페이스선언에 타입매개변수 가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다.
각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다.
제네릭 타입을 하나 정의 하면 그에 딸린 로타입도 함께 정의 된다.
로 타입이란 제네릭타입에서 타입 매개변수를 전혀 사용하지 않았을 때를 말한다. 예컨다 List
로타입을 쓰면 제네릭이 안겨주는 안전성과 표현력을 모두 읽게 된다.
제네릭 타입을 쓰고 싶지만 실제 타입 매개변수가 무엇인지 신경쓰고 싶지 않다면 물음표(?)를 사용하자.
예컨데, 제네릭 타입인 Set
로 타입컬렉션에는 아무 원소나 넣을 수 있으니 타입 불변식을 훼손하기 쉽다. 반면 Collection<?> 에는 null 외에는 어떤 원소도 넣을 수 없다.
소소한 예외
- class 리터럴에는 로타입을 써야한다.
- instanceof 연산사의 경우 로타입을 사용하는 편이 깔끔하다.
핵심정리
로 타입을 사용하면 런타임에 예외가 일어날 수 있으니 사용하면 안된다. 로타입은 제네릭이 도입되기 이전 코드와의 호환성을 위해 제공될 뿐이다. 빠르게 훑어보자면, Set