0

可能重复:
< 之间有什么区别?超级 E> 和 <? 扩展 E>?

我所在团队中的一些 Java 程序员正在编写函数,这些函数返回类型的对象List<? extends T>以创建只读列表,并返回类型的对象List<? super T>以创建只写列表。

在 Java 中,什么使List<? extends T>只读和只List<? super T>写?

4

3 回答 3

1

请阅读“生产者扩展,消费者超级”(PECS) - 我可能需要做同样的事情:)

只读:

如果您想确保方法将项目集合(使用泛型)作为参数 - 当您使用时List<? extends T>- 列表可以包含 T 的任何子类型但不能添加到集合中,因为它在运行时不知道具体的List 包含的 T 类型。

只写:

对于List<? super T>,列表可以包含 T 而不管实际的参数化类型(使用 super 将允许这种情况发生)。

希望能帮助到你。

于 2012-06-26T04:37:26.800 回答
0

该定义的List<? extends T>意思是“一个List<X>实现,X必须在哪里T或其子类/实现。换句话说,您唯一的保证是已经存储在列表中的对象将适合类型的变量T。但是,由于列表可能已被声明为扩展或实现 T 的类,您无法保证类型T本身的对象将适合列表。

简单的例子:List<String>is a List<? extends T>if Tis Object。您可以安全地从中绘制Object-type 对象,但显然不能将其他Object-type 对象放入其中,除非它们绝对是字符串。

于 2012-06-26T05:19:28.577 回答
0

您可以T从 a 中获得 a List<? extends T>,但您唯一可以放入其中的是null文字。您可以将 aT放入 a List<? super T>,但您唯一能从中得到的是 a Object(然后将其转换为 是不安全的T)。

因此,这些限制使这些尽管不完美但很好地提醒了意图。使用 a List<? extends T>,您不能将大多数内容放入其中 - 所以它有点只读。使用 a List<? super T>,您无法从中得到非常有用的东西——所以它有点只写。

请注意,其中任何一个实际上都不是只读或只写的。我在上面提到了一些可以将事物放入或取出它们的方法,并且使用“只读”构造,您仍然remove可以在对象本身或其迭代器上调用函数。

于 2012-06-26T04:23:37.687 回答