불공변?
→서로 다른 타입 Type1, Type2가 있을 때, List<Type1> 은 List<Type2> 의 상위타입도, 하위 타입도 아님
필요성
public class Stack<E> {
private List<E> list = new ArrayList<>();
public void pushAll(Iterable<E> src){
for(E e : src){
push(e);
}
}
}
void test(){
Stack<Number> stack = new Stack<>();
List<Integer> intList = Arrays.asList(1,2,3,4);
stack.pushAll(intList); // Error
}
→ 위 같은 상황을 위한 해결책이 필요함
public void pushAll(Iterable<? extends E> src){
for(E e : src){
push(e);
}
}
Stack<Number> stack = new Stack<>();
라는 코드 작성 시 pushAll의 매개변수에는 Number의 하위 타입이 들어갈 수 있게 됨public void popAll(Collection<? super E> dst) {
dst.addAll(list);
list.clear();
}
마찬가지로 매개변수 타입이 E의 상위 타입임을 명시해줄 때는 super 키워드 사용
입력 매개변수가 생산자와 소비자 역할을 동시에 한다면 와일드카드 타입을 써도 좋을 게 없다.
→ 어떤 데이터를 생성하고, 동시에 사용해야 한다면 타입을 명확히 지정해야 하는 상황이므로 와일드카드 타입을 쓰지 말아야 함
<aside> 🏷️
PECS : producer-extends, consumer-super
</aside>
매개변수화 타입 T가 생산자라면 <? extends T>
매개변수화 타입 T가 소비자라면 <? super T>
ex
public void pushAll(Iterable<? extends E> src){
for(E e : src){
push(e);
}
}