通配符和’T’之间有什么区别?
public void takeThing(ArrayList list) public void takeThing(ArrayList list)
为什么这句话错了? 我的意思是为什么?
不能在前面使用? 但是T
可以。 有什么不同?
可能重复“ 何时在Java Generics中使用通配符? ”
这是这个问题的答案。但我不明白这是什么意思。 “如果你说void,则没有返回类型。如果你指定则返回类型。我不知道你可以指定返回类型或没有返回类型。”
public void takeThing(ArrayList extends Animal> list)
表示“使用Animal
的任何子类列表执行某些操作”。
public void takeThing(ArrayList list)
表示“用Animal
的某个特定子类(AKA T
)的列表做某事”。
如果我在第一个方法上调用list.get()
,我所知道的返回类型就是它扩展了Animal
。 在第二种方法中,如果我有另一个List
实例,我知道无论T
是什么类型,两个列表都会接受相同的类型。
如果我说的话,更进一步
Animal animal = list.get(0);
我不能再说了
list.add(animal);
甚至在同一个列表中,因为我们没有对generics子类型的引用。 但是,如果我声明一个List
,其中
,我现在可以说
T animal = list.get(0); list.add(animal);
因为我们知道list
需要T
类型的元素。
编写
绑定类型名称T
,以便稍后可以在定义中引用它(包括在参数列表中)。
如果你写了 extends Animal>
extends Animal>
,然后你没有命名类型。 因此,您以后不能参考它。 你不能把它称为?
之后因为这可能是模棱两可的(如果你有两个类型参数怎么办?)。
Java禁止你编写public > ...
因为这样的声明是无用的(type参数没有命名所以不能使用它)。