这来自HeadFirst :(第575页)
这是:
public <T extends Animal> void takeThing(ArrayList<T> list)做同样的事情:
public void takeThing(ArrayList<? extends Animal> list)所以我的问题是:如果它们完全相同,我们为什么不写
public <? extends Animal> void takeThing(ArrayList<?> list)或
public void takeThing(ArrayList<T extends Animal> list)另外,什么时候使用一个?用泛型代替方法声明中的T(如上面所示),还是用于类声明?有什么福利待遇?
发布于 2013-05-23 07:27:06
最大的区别是
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;
}使用第一种方法,如果您传入一个猫列表,您将得到一个以Cat为键的Map。第二个方法总是返回一个带有一般动物密钥的Map。
顺便说一下,这是无效的java语法:
public <? extends Animal> void takeThing(ArrayList<?> list)使用这种形式的泛型方法声明,您必须使用有效的java标识符,而不是"?“。
编辑:
表单"?extends“仅适用于变量或参数类型声明。在通用方法解密中,它必须是“标识符扩展类型”,因为您可以在方法中引用“标识符”。
https://stackoverflow.com/questions/16707340
复制相似问题