为什么要返回List <! - ?扩展T - >只读并返回List <! - ?超级T - >只写?

时间:2012-06-26 04:04:48

标签: java

  

可能重复:
  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>只写?

3 个答案:

答案 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>TObject。你可以安全地从中绘制Object - 类型的对象,但显然你不能在其中加入其他Object - 类型的对象,除非它们绝对是字符串。