这是来自 HeadFirst Java的 :(第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或用于类声明?有什么好处?
之间的最大区别
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;
}
使用第一种方法,如果您传递“猫的清单”,您将获得一个以猫为键的地图。第二种方法将始终返回带有常规Animal键的Map。
顺便说一句,这是无效的Java语法:
public <? extends Animal> void takeThing(ArrayList<?> list)
使用这种形式的泛型方法声明,您必须使用有效的Java标识符,而不是“?”。
编辑:
形式“?extended Type”仅适用于变量或参数类型声明。在通用方法偏斜内,它必须是“标识符扩展类型”,因为您可以从方法内引用“标识符”。
问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。
所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?
这2个功能有什么区别? 我看到了相同的输出。
在试图理解java泛型类型和通配符“?”的用法时,我尝试了以下方法: 我得到以下编译错误(使用Oracle JDeveloper作为IDE): 为什么上面的代码不能编译,而赋值却可以呢?另外,如果我想调用,什么是可接受的参数值?
本文向大家介绍Java 泛型总结(三):通配符的使用,包括了Java 泛型总结(三):通配符的使用的使用技巧和注意事项,需要的朋友参考一下 简介 前两篇文章介绍了泛型的基本用法、类型擦除以及泛型数组。在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符