通配符和’T’之间有什么区别?

public  void takeThing(ArrayList list) public  void takeThing(ArrayList list) 

为什么这句话错了? 我的意思是为什么? 不能在前面使用? 但是T可以。 有什么不同?

可能重复“ 何时在Java Generics中使用通配符? ”

这是这个问题的答案。但我不明白这是什么意思。 “如果你说void,则没有返回类型。如果你指定则返回类型。我不知道你可以指定返回类型或没有返回类型。”

 public void takeThing(ArrayList 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 ,以便稍后可以在定义中引用它(包括在参数列表中)。

如果你写了 ,然后你没有命名类型。 因此,您以后不能参考它。 你不能把它称为? 之后因为这可能是模棱两可的(如果你有两个类型参数怎么办?)。

Java禁止你编写public ...因为这样的声明是无用的(type参数没有命名所以不能使用它)。