[Effective Java 3/e] 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라
아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라
유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하라
- 입력 매개변수가 생산자와 소비자 역활을 동시에 한다면 와일드카드 쓸 필요 없음
와이드카드 타입을 사용하지 않은 메서드 - 결함이 있다
// 생산자
public void pushAll(Iterable<E> src) {
for (E e : src)
push(e);
}
// 소비자
public void popAll(Collection<E> dst) {
while (!isEmpty())
dst.add(pop())
}
- Stack
로 선언한 후 pushAll(intVal) - integer 타입 사용 시 오류 발생 - 매개변수화 타입이 불공변이기 때문
- List
!= List
- List
- 매개변수화 타입이 불공변이기 때문
매개변수에 와일드카드 타입 적용
// 생산자
public void pushAll(Iterable<? extends E> src) {
for (E e : src)
push(e);
}
// 소비자
public void popAll(Collection<? super E> dst) {
while (!isEmpty())
dst.add(pop())
}
- 매개변수화 타입 T
- 생산자라면 <? extends T> 사용
- 소비자라면 <? super T> 사용
- Comparable과 Comparator는 모두 소비자