[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

매개변수에 와일드카드 타입 적용

// 생산자
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는 모두 소비자