Java-Chip4 / StudyingRecord

강의 내용 정리📝
6 stars 2 forks source link

<? extends X>와 <T extends X> 의 차이점 #28

Closed anthologia closed 2 years ago

anthologia commented 2 years ago

둘은 서로 같은 역할을 한다고 생각이 되는데, 어떤 점에서 차이가 있는지 궁금하다. 서로 완벽하게 대치되는 관계일까?

anthologia commented 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 타입> 형태는 변수 혹은 파라미터에만 적용될 수 있다.

https://stackoverflow.com/questions/16707340/when-to-use-wildcards-in-java-generics