2. API 유연성이 필요한 경우
• Stack 클래스의 한계
public class Stack<E> {
…
public void pushAll(Iterable<E> src){
for(E e : src)
push(e);
}
public void popAll(Collection<E> dst) {
while(!isEmpty())
dst.add(pop());
}
…
}
3. API 유연성이 필요한 경우
• Stack 클래스의 한계 → Bounded wild card
public class Stack<E> {
…
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());
}
…
}
4. 언제 어떤 와일드 카드 타입을 사용할까?
• PESC
Producer – extends, Consumer - super
public class Stack<E> {
…
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());
}
…
}
8. 타입 매개변수와 와일드 카드
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);
9. 타입 매개변수와 와일드 카드
• 와일드 카드 타입을 잡아내는 private helper method를 사용
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
private static <E> void swapHelper(List<E> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
10. 요약.
• 바운드 와일드 카드를 사용해서 API의 유연성을 높이자
• Producer–extends, Consumer– super (PESC)를 생각해서 작성하
자
– 모든 Comparable과 Comparator는 소비자