제네릭 공부하다가 와일드카드에서 완전히 막혔습니다. 책 봐도 볼 때는 알겠는데 막상 코드 짜면 컴파일 에러가 나서요.
이건 왜 add가 안 되는 걸까요?
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // 이건 됨
list.add(1); // 컴파일 에러!
반대로 이건 add는 되는데 꺼낼 때가 이상하고요.
List<? super Number> list2 = new ArrayList<Object>();
list2.add(1); // 이건 됨
Number x = list2.get(0); // 컴파일 에러!
하나는 읽기만 되고 하나는 쓰기만 되는 느낌인데, 실제로 Collections.copy 같은 거 시그니처 보면 둘 다 섞여 있더라고요. 어떤 상황에 뭘 골라야 하는지 기준이 안 잡힙니다. 도와주세요.