我正在阅读的一本关于 Java 的书告诉我以下两段代码是等价的:
public <T extends Animal> void takeThing(ArrayList<T> list)
public void takeThing(ArrayList<? extends Animal> list);
在对面的页面上,我得知后一段代码使用了 '?'作为通配符,意味着不能向列表中添加任何内容。
这是否意味着如果我有一个列表(或其他集合类型?),我不能让它们同时接受多态参数并重新调整大小?还是我只是误解了什么?
感谢所有帮助/评论,即使它们稍微偏离主题。谢谢。
最佳答案
Does this mean that if I ever have a list (or other collection types?) that I can't make them simultaneously accept polymorphic arguments AND be re-sizable?
没有。
这两段代码并不完全等价。在第一行中,方法 takeThing
有一个类型参数 T
。在第二行中,您使用了通配符。
当您使用第一个版本时,您将指定用于T
的具体类型。因为具体类型是已知的,所以添加到列表中没有问题。
在第二个版本中,你只是说“list
是一个 ArrayList
,它包含一些扩展 Animal
的未知类型的对象” .究竟是什么类型,尚不得而知。您不能将对象添加到这样的列表中,因为编译器没有足够的信息(它不知道实际类型是什么)来检查您添加到列表中的内容是否应该被允许。
关于java - Java 中的泛型(和通配符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474791/