Con*_*orW 5 java generics collections list wildcard
我正在阅读Java的一本书告诉我,以下两段代码是等价的:
public <T extends Animal> void takeThing(ArrayList<T> list)
public void takeThing(ArrayList<? extends Animal> list);
Run Code Online (Sandbox Code Playgroud)
在相反的页面上,我被告知后一段代码使用'?' 作为通配符,意味着什么都不能添加到列表中.
这是否意味着如果我有一个列表(或其他集合类型?),我不能让它们同时接受多态参数并且可以重新调整大小?或者我只是误解了什么?
所有帮助/评论都表示赞赏,即使他们略微偏离主题.谢谢.
这是否意味着如果我有一个列表(或其他集合类型?),我不能让它们同时接受多态参数并调整大小?
不。
这两段代码并不完全等效。在第一行中,该方法takeThing
有一个类型参数T
。在第二行中,您使用了通配符。
当您使用第一个版本时,您将指定将使用什么具体类型T
。因为具体类型是已知的,所以添加到列表中没有问题。
在第二个版本中,您只是说“list
是一个ArrayList
包含扩展的某种未知类型的对象Animal
”。这种类型到底是什么,尚不清楚。您无法将对象添加到这样的列表中,因为编译器没有足够的信息(它不知道实际类型是什么)来检查您添加到列表中的内容是否应该被允许。