可能重复:
What is a difference between <? super E> and <? extends E>?
我所在的团队中的一些Java程序员正在编写返回类型为List<? extends T>
的对象的函数,以生成只读列表并返回类型为List<? super T>
的对象以生成只写列表。 / p>
在Java中,是什么使List<? extends T>
成为只读而List<? super T>
只写?
答案 0 :(得分:1)
请阅读“生产者延伸,消费者超级”(PECS) - 我可能需要做同样的事情:)
只读:
如果您希望确保方法将项目集合(使用泛型)作为参数 - 当您使用List<? extends T>
时 - 该列表可以包含T的任何子类型但不能添加到集合中它在运行时不知道List包含的特定T类型。
只写:
对于List<? super T>
,无论实际参数化类型如何,列表都可以包含T(使用super将允许这种情况发生)。
希望它有所帮助。
答案 1 :(得分:0)
您可以从T
获得List<? extends T>
,但您唯一可以加入的是null
字面值。您可以将T
放入List<? super T>
,但唯一可以从中获取Object
(然后将其转换为T
不安全。)< / p>
所以,这些限制使这些非常好,虽然不完美,提醒了意图。使用List<? extends T>
,您无法将大部分内容放入其中 - 所以它只是只读的。使用List<? super T>
,你无法从中获得非常有用的东西 - 所以它只是一种只写。
请注意,其中任何一个都不是实际只读或只写。我注意到一些方法可以将上面的内容输入或输出,并且使用“只读”结构,您仍然可以在对象本身或其迭代器上调用remove
函数。
答案 2 :(得分:0)
定义List<? extends T>
表示“List<X>
实现,其中X
必须是T
或其子类/实现。换句话说,您唯一的保证就是对象已经存储在列表中的类型将适合T
类型的变量。但是,由于列表可能是为扩展或实现T的类声明的,因此您无法保证T
类型的对象本身会适合列表。
简单示例:如果List<String>
为List<? extends T>
,T
为Object
。你可以安全地从中绘制Object
- 类型的对象,但显然你不能在其中加入其他Object
- 类型的对象,除非它们绝对是字符串。