之间的最大区别
public <T extends Animal> void takeThing(ArrayList<T> list)
和
public void takeThing(ArrayList<? extends Animal> list)
是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。
这里有一个更复杂的例子来说明这一点:
// here i can return the concrete type that was passed inpublic <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()); // I assume there is a getName() method } return names;}// here i have to use general Animalpublic 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()); // I assume there is a getName() method } return names;}使用第一种方法,如果您传递“猫的清单”,您将获得一个以猫为键的地图。第二种方法将始终返回带有常规Animal键的Map。
顺便说一句,这是无效的Java语法:
public <? extends Animal> void takeThing(ArrayList<?> list)
使用这种形式的泛型方法声明,您必须使用有效的Java标识符,而不是“?”。
编辑:
形式“?extended Type”仅适用于变量或参数类型声明。在通用方法偏斜内,它必须是“标识符扩展类型”,因为您可以从方法内引用“标识符”。



