제네릭 타입
이라 한다.List<E>
, E: 원소의 타입을 나타내는 타입 매개변수List<String>
: 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입List<E>
의 로 타입은 List
// 컬렉션의 로 타입
private final Collection stamps = ...;
// stamp 만 넣어야 하는데 실수로 Coin을 넣는다.
stamps.add(new Coin(...)); // unchecked call 경고
// 동전을 꺼내기 전에는 에러를 알 수 없다.
for (Iterator i = stamps.iterator(); i.hasNext(); ) {
Stamp stamp = (Stamp) i.next(); // Coin 나오면 ClassCastException을 던진다.
stamp.cancel();
}
// 매개변수화된 컬렉션 타입
private final Collection<Stamp> stamps = ...;
- 소거(erasure) : 제네릭 타입에 사용된 타입 정보를 컴파일 타입에만 사용하고 런타임에는 소거하는 것을 말한다.
- List
, List
EX) Set<E>
의 비한정 와일드카드 타입은 Set<?>
- 컬렉션의 타입 불변식을 훼손하지 못하게 막았고, 컬렉션에서 꺼낼 수 잇는 객체의 타입도 알 수 없게 된다.
클래스타입.class
의 형태
- <?> 는 코드만 지저분하게 만든다.
if (o instanceof Set) { // 로 타입
Set<?> s = (Set<?>) o; // 와일드카드 타입
}
- EX) List
- EX) String
- List
- EX) E
- EX) List<?>
- EX) List
- EX)
- EX) <T extends Comparable
>
- EX) <? extends Number>
- EX) static
List asList(E[] a)
- EX) String.class
Reference: