两者之间的巨大区别
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 in
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()); // I assume there is a getName() method
}
return names;
}
// here i have to use general Animal
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()); // I assume there is a getName() method
}
return names;
}
使用第一种方法,如果你传入猫列表,你会得到一个以猫为键的地图。第二种方法将始终返回具有常规动物键的 Map。
顺便说一句,这不是有效的java语法:
public <? extends Animal> void takeThing(ArrayList<?> list)
使用这种形式的泛型方法声明,您必须使用有效的java标识符而不是“?”。
编辑:
形式“?扩展类型“仅适用于变量或参数类型声明。在泛型方法描述中,它必须是“标识符扩展类型”,因为您可以从方法中引用“标识符”。