아이템 26. 로 타입은 사용하지 말라 - KwangtaekJung/book-effective-java GitHub Wiki
-
클래스와 인터페이스에
타입 매개변수(type parameter)
가 쓰이면, 이를제네릭 클래스
,제네릭 인터페이스
라고 한다. -
통틀어
제네릭 타입(generic type)
이라 한다. -
제네릭 타입은 일련의
매개변수화 타입(parameterized type)
을 정의한다. -
제네릭 타입에서 타입 매개변수를 전혀 사용하지 않는 경우를
로 타입(raw type)
이라 한다.- raw 타입을 쓰면 제네릭이 안겨주는 안정성과 표현력을 모두 잃게 된다.
- 예외 1) class 리터럴
- 예외 2: instanceof 연산자
- raw 타입을 쓰면 제네릭이 안겨주는 안정성과 표현력을 모두 잃게 된다.
-
핵심정리
- 로 타입을 사용하면 런타임에 예외가 일어날 수 있으니 사용하면 안된다.
- 로 타입은 제네릭 도입 이전의 코드와의 호환성을 위해 제공될 뿐이다.
-
List<Object>
와List<?>
의 차이점-
Object[] arr = new String[10];
=>배열은 공변타입이라 Object로 이렇게 가능함. 단, 다른 타입을 add 하려고 하면 런타임에 에러남.
-
하지만 제네릭을 Object로 걸어 놓는다고 해서 제네릭 타입이 어떤 타입이든 다 받아주겠다 이런 게 안됩니다
void method01(List<Object> list){ } method01(new ArrayList<String>());
-
<?>
는 와일드카드라는 명칭으로 어떤 제네릭타입이든 다 받아주겠다는겁니다.void method02(List<?> list){ } method02(new ArrayList<String>());
-
한글 용어 | 영문 용어 | 예 | 아이템 |
---|---|---|---|
매개 변수화 타입 | Parameterized type | List | Item 26 |
실제 타입 매개 변수 | actual type parameter | String | Item 26 |
제네릭 타입 | generic type | List | Item 26, 29 |
정규 타입 매개 변수 | formal type parameter | E | Item 26 |
비한정적 와일드 카드 타입 | unbounded wildcard type | List<?> | Item 26 |
로 타입 | raw type | List | Item 26 |
한정적 타입 매개변수 | bounded type parameter | Item 29 | |
재귀적 타입 한정 | recursive type bound | <T extends Comparable> | Item 30 |
한정적 와일드 카드 타입 | bounded wildcard type | List<? extends Number> | Item 31 |
제네릭 메서드 | generic method | static <E> List<E> asList(E[] a) |
Item 30 |
타입 토큰 | type token | String.class | Item 33 |