java - 什么是 PECS(生产者扩展消费者 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<? 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/54265769/

相关文章:

java - 是否可以在运行时提供新的 PropertiesConfiguration 文件?

java - RxJava : How to make observable to create on different thread than main thread

java - JTextArea 未列出结果

ios - 使用泛型时的 EXC_BAD_ACCESS

c# - 使用反射在签名为 : SomeObject. 的对象实例上调用泛型方法 SomeGenericInstanceMethod<T>(T argument)

java - 如何在调用 super 时简化这个数学运算?

python - Python 3 中的 Django 问题 "super() argument 1 must be type, not WSGIRequest"

java - 为什么他们在这个 Java GridBagLayoutDemo 示例中声明这些静态变量?

c#从 "byte"类型转换为 "generic" "K"类型

java - 编译成功但运行时出现错误