java - Java 中的泛型(和通配符)

标签 java list generics collections wildcard

我正在阅读的一本关于 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/

相关文章:

java - java接口(interface)中的泛型

java - 如何正确初始化在单独方法中创建的变量,以便在另一个方法中使用?

java - 防止 Java 7/8 采样声音在播放时发出咔嗒声(适用于 6)

CSS 悬停在链接列表项上

java - 列表中的 EditText 未按应有的方式工作

java - 如何在 Eclipse 中激活泛型类型警告?

用于将长 IPv6 地址转换为其压缩形式的 Java 库

java - 如何使用智能卡中的证书创建 .jks 文件?

mysql - 生成日期列表并计算每天的在线帖子数

C# 泛型类型函数,使泛型方法因 System.String 失败