Java中的泛型(和通配符)

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)

在相反的页面上,我被告知后一段代码使用'?' 作为通配符,意味着什么都不能添加到列表中.

这是否意味着如果我有一个列表(或其他集合类型?),我不能让它们同时接受多态参数并且可以重新调整大小?或者我只是误解了什么?

所有帮助/评论都表示赞赏,即使他们略微偏离主题.谢谢.

Jes*_*per 3

这是否意味着如果我有一个列表(或其他集合类型?),我不能让它们同时接受多态参数并调整大小?

不。

这两段代码并不完全等效。在第一行中,该方法takeThing有一个类型参数T。在第二行中,您使用了通配符。

当您使用第一个版本时,您将指定将使用什么具体类型T。因为具体类型是已知的,所以添加到列表中没有问题。

在第二个版本中,您只是说“list是一个ArrayList包含扩展的某种未知类型的对象Animal”。这种类型到底是什么,尚不清楚。您无法将对象添加到这样的列表中,因为编译器没有足够的信息(它不知道实际类型是什么)来检查您添加到列表中的内容是否应该被允许。