public <? extends Animal> void takeThing(ArrayList<?> list)
public <T extends Animal> void takeThing(ArrayList<T> list)
Run Code Online (Sandbox Code Playgroud)
为什么这句话错了?我的意思是为什么?不能在前面使用?但T可以.有什么不同?
可能重复" 何时在Java Generics中使用通配符? "
这是这个问题的答案.但我不明白这是什么意思."如果你说void,则没有返回类型.如果你指定那么就有一个返回类型.我不知道你可以指定返回类型或没有返回类型."
写入<T extends Animal> 会绑定类型名称T,以便稍后在定义中(包括在参数列表中)引用它。
如果你写了<? extends Animal>,那么你就没有命名类型。因此,您以后无法参考它。您不能稍后引用它,?因为这可能不明确(如果您有两个类型参数怎么办?)。
Java禁止你写,public <?> ...因为这样的声明是没有用的(类型参数没有命名,所以不能使用)。
public void takeThing(ArrayList<? extends Animal> list)
Run Code Online (Sandbox Code Playgroud)
表示"使用任何子类列表执行某些操作Animal".
public <T extends Animal> void takeThing(ArrayList<T> list)
Run Code Online (Sandbox Code Playgroud)
表示"使用某个特定子类(AKA T)列表执行某些操作Animal ".
如果我调用list.get()第一个方法,我所知道的返回类型就是它扩展了Animal.在第二种方法中,如果我有另一个实例List<T>,我知道无论什么类型T,两个列表都会接受相同的类型.
如果我说的话,更进一步
Animal animal = list.get(0);
Run Code Online (Sandbox Code Playgroud)
我不能再说了
list.add(animal);
Run Code Online (Sandbox Code Playgroud)
甚至在同一个列表中,因为我们没有对泛型子类型的引用.但是,如果我宣布在List<T>哪里<T extends Animal>,我现在可以说
T animal = list.get(0);
list.add(animal);
Run Code Online (Sandbox Code Playgroud)
因为我们知道list期望元素的类型T.