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
Collection 인터페이스에 있는 add는 E라는 type parameter를 사용해서 특정 타입만으로 제한을 했기 때문에 추가하는 작업은 무사히 진행 되겠군요.
실제 ArrayList에서 add(E)를 구현한 코드는 다음과 같습니다.
public boolean add(E o) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = o;
return true;
}