로 타입
로 타입은 자바5 이전의 코드와 호환성을 위해 유지하는 것이지 사용해서는 안된다. 다음은 로 타입 사용으로 인해 ClassCastException을 Runtime에 던지는 예이다.
1 | public static void main(String[] args) { |
이런 오류를 겪는 코드는 문제를 겪는 코드와 원인을 제공한 코드가 물리적으로 상당히 떨어져 있을 가능성이 크다. 제네릭 타입을 사용하면 제네릭 타입은 일련의 매개변수화 타입을 정의하고 컴파일러에게 해당 타입의 인스턴스만 삽입할 것을 알려줄 수 있다. 따라서 아무런 경고 없이 동작한다면 의도대로 동작할 것임을 보증하는 것이다.
만약 모든 타입을 받을 수 있는 컬렉션을 원한다면 List\
만약 제네릭 타입을 쓰고 싶지만 타입 매개변수가 무엇인지 신경쓰고 싶지 않을 때는 ?를 쓰자. 제네릭 타입인 Set\
로 타입을 사용하는 예
class 리터럴
클래스 리터럴에는 로 타입을 사용해야 한다. 자바 명세에서는 클래스 리터럴에 매개변수화 타입의 사용을 못하게 했다. 즉, List.class, String[].class, int.class는 허용하나 List\
instanceof
런타임에는 제네릭 타입 정보가 지워지므로 instanceof 연산자는 비한정적 와일드 카드 타입 이외의 매개변수화 타입에는 적용할 수 없다. 그리고 로 타입이든 비한정적 매개변수 타입이든 instanceof는 동일하게 동작한다. 비한정적 와일드카드 타입의 꺾쇠괄호와 물음표는 아무런 역할 없이 코드만 지저분하게 하니 차라리 로 타입을 쓰는 편이 깔끔하다.
1 | if( o instanceof Set) { |