Generics 번외 - 겉모습만 보곤 알 수 없슴.
“와일드 카드를 사용한 메소드 내에서 Collection에 어떤 요소를 추가하는 일은 컴파일 에러를 발생합니다.”
하지만 겉모습으로 판단할 수 없습니다. Collection에 다음과 같은 인터페이스가 있습니다.
boolean addAll(Collection<? extends E> c);
“Collection을 매개변수로 받아서 그 안에 들어있는 어딘가에 집어 넣으려는 매소드 같은데 와일드 카드를 쓰고 있자나.. 어허.. 이거 뭐지? 이게 되나??” 라는 생각을 했었습니다.
그래서 이것을 구현한 코드를 찾아 봤습니다.
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next()))
modified = true;
}
return modified;
}
Collection 인터페이스를 구현하고 있는 AbstractCollection 클래스에 있는 소스코드 입니다.
Collection 인터페이스에 있는 add() 메소드를 보지 않는 이상 알 수가 없겠네요. 위 메소드 내에서는 추가하는 일을 add() 메소드에게 넘기고 있기 때문이지요.
bl196.bmp
실제 ArrayList에서 add(E)를 구현한 코드는 다음과 같습니다.
public boolean add(E o) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}