@ 어떤 배열을 만들고 그 배열을 매개변수로 쓰는 메서드가 있다면 그 배열의 하위 클래스는 모두 인자값으로 사용될 수 있다.

void foo(Animal[] a){
........
}

foo(animalArray);
foo(aDogArray);//다형성에 하위객체도 인자값으로 가능

@ 하지만 배열이 아닌 컬렉션류는 얘기가 달라진다.
void foo(ArrayList<Animal> animals){....}
ArrayList<Dog> dogs = new ArrayList<Dog>();
foo(dogs);//컴파일 에러가 난다.


@ 이런 메서드 인자를 하위 클래스도 받아들일 수 있게끔 해주는 것이 와일드카드(wildcard)이다.

void foo(ArrayList<? extends Animal> animals){....}

extends라는 키워드는 확장(extends)도 될 수 있고 구현(implements)도 될 수 있다.
이 와일드 카드를 사용하면 컴파일러에서 목록에 뭔가를 추가하는 작업을 전혀 허용하지 않기에
위에 foo메서드에서 animals 라는 어레이리스트에 add를 할 수 없게 된다.(잘못된 소스를 미연에 방지)

@ 배열 유형은 실행 중에 다시 확인하지만 컬렉션 유형은 컴파일중에만 확인하기때문에......

public <T extends Animal> void takeThing(ArrayList<T> list) 와
public void takeThing(ArrayList<? extends Animal> list)는 같은 소스다.

두가지 유형이 존재하는 이유는
public void takeThing(ArrayList<? extends Animal> one, ArrayList<? extends Animal> two) 보다
public <T extends Animal> void takeThing(ArrayList<T> one,ArrayList<T> two)로 더 깔끔하게 쓸 수 있기 때문이다.
Posted by Taoist
,