Kiedy używać symboli wieloznacznych w Java Generics?

to jest zHeadFirst Java: (strona 575)

To:

public <T extends Animal> void takeThing(ArrayList<T> list)

Robi to samo co to:

public void takeThing(ArrayList<? extends Animal> list)

Oto moje pytanie: jeśli są dokładnie takie same, dlaczego nie piszemy

public <? extends Animal> void takeThing(ArrayList<?> list)

lub

public void takeThing(ArrayList<T extends Animal> list)

Ponadto, kiedy byłoby użyteczne użycie? zamiast T w deklaracji metody (jak powyżej) w Generics lub w deklaracji klasy? Jakie są korzyści?

questionAnswers(6)

yourAnswerToTheQuestion