java - 什么是PECS(Producer Extends Consumer Super)?

标签 java generics super bounded-wildcard pecs

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

谁能给我解释一下如何使用 PECS 来解决 extendssuper 之间的混淆?

最佳答案

tl;dr: “PECS”是从 Collection 的角度来看的。如果您从通用集合中提取项目,则它是生产者,您应该使用 extends ;如果您在其中填充元素,则它是消费者,您应该使用 super .如果你同时使用同一个集合,你不应该使用 extendssuper .


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

案例 1:您想浏览 Collection 并处理每个项目。
那么列表是生产者,所以你应该使用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(Producer Extends Consumer Super)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723397/

相关文章:

java - 在 JavaParser 中查找 super 关键字的类名

java - 如何在 Spring Boot 中使用 `MetricsModule` 自动配置 `JacksonAutoConfiguration`

java - 将元素添加到 List<?扩展父类(super class)>,需要澄清

java - 斯卡拉 : class[T] extends T?

python - 通过子类化修改命名元组的构造函数参数?

javascript - 为什么 [[HomeObject]] 在方法的简写语法上不同?

java - 有状态 xxxServerHandle 和无状态 yyyServerhandle 之间的区别?

java - 使用 while 循环让用户输入多个 int 并找到最大值和最小值

Java最终抽象类

java - eclipse 警告 : Type safety (Java Generics)