Closed anthologia closed 2 years ago
A : public <T extends Animal> void takeThing(ArrayList<T> list)
B : public void takeThing(ArrayList<? extends Animal> list)
A와 B의 큰 차이는 A는 해당 takeThing 메서드 안에서 T를 구체적인 클래스 타입으로써 사용할 수 있다. 그러나 B에서 와일드카드(?
)는 그렇게 하는 것이 불가능하다. 아래 코드를 통해 자세한 과정을 살펴보자.
// CASE A
public <T extends Animal> Map<T, String> getNamesMap(ArrayList<T> list) {
Map<T, String> names = new HashMap<T, String>();
for (T animal : list) {
names.put(animal, animal.getName());
}
return names;
}
// CASE B
public Map<Animal, String> getNamesMap(ArrayList<? extends Animal> list) {
Map<Animal, String> names = new HashMap<Animal, String>();
for (Animal animal : list) {
names.put(animal, animal.getName());
}
return names;
}
만약 A 메서드를 호출했을 때, ArrayList<Cat>
을 넘겨 주었다면, Map<Cat, String>
타입의 객체를 얻을 수 있다.
그러나 B 메서드에서는 언제나 Map<Animal, String>
만 받을 수 있다. 그 이유는 아래의 코드가 문법적으로 불가능하기 때문이다. <? extends 타입>
형태는 변수 혹은 파라미터에만 적용될 수 있다.
public <? extends Animal> void takeThing(ArrayList<?> list)
Xhttps://stackoverflow.com/questions/16707340/when-to-use-wildcards-in-java-generics
둘은 서로 같은 역할을 한다고 생각이 되는데, 어떤 점에서 차이가 있는지 궁금하다. 서로 완벽하게 대치되는 관계일까?