java - 什么是 PECS(生产者扩展消费者 super )?

标签 java generics super bounded-wildcard pecs

我在阅读泛型时遇到了 PECS(Producer extends 和 Consumer super 的缩写)。

有人可以向我解释如何使用 PECS 来解决 extendssuper 之间的混淆吗?

最佳答案

tl;dr:“PECS”是从集合的角度来看的。如果您从通用集合中提取项目,那么它是生产者,您应该使用 extends ;如果您填充元素,则它是消费者,您应该使用 super 。如果您对同一个集合执行这两项操作,则不应使用 extendssuper .

<小时/>

假设您有一个方法,该方法将一组事物作为参数,但您希望它比仅接受 Collection<Thing> 更灵活。 .

情况 1:您想要浏览集合并对每个项目执行操作。
那么列表是一个生产者,所以你应该使用 Collection<? extends Thing> .

推理是 Collection<? extends Thing>可以包含 Thing 的任何子类型,因此每个元素将表现为 Thing当您执行操作时。 (实际上,您无法向 Collection<? extends Thing> 添加任何内容(除了 null),因为您无法在运行时知道该集合包含 Thing 的哪个特定子类型。)

情况 2:您想要将内容添加到集合中。
那么该列表是一个消费者,所以你应该使用 Collection<? super Thing> .

这里的推理是与 Collection<? extends Thing> 不同, Collection<? super Thing>永远可以持有Thing无论实际的参数化类型是什么。在这里,您不关心列表中已有的内容,只要它允许Thing即可。待添加;这就是? super Thing保证。

关于java - 什么是 PECS(生产者扩展消费者 super )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59522567/

相关文章:

java - 从 url 获取简单的 Json 字符串并将其转换为 String[] Android

java - 如何使用 java(selenium 网络驱动程序)从下拉列表中选择值

java - getThis() 技巧和 ClassCastException

Python 从一个类继承但覆盖调用另一个类的方法?

java - 从 Java 访问 gmail

java - 使用 XML 绑定(bind)的数据导入/导出功能的灵活性

generics - .NET 4.0 中协方差和逆变的一个很好的实际应用?

java:针对接口(interface)进行编程,但必须实例化一个具体类

cassandra - 如何从 Hector Cassandra 的列族中检索一组 rowID 中 super 列的所有值

python - 子类化 Tkinter 小部件时如何使用 super()?