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