我正在阅读
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的未知类型的对象”.究竟是什么类型,不知道.您无法将对象添加到此类列表中,因为编译器没有足够的信息(它不知道实际类型是什么)来检查您是否应该允许添加到列表中的内容.