我在阅读泛型时遇到了 PECS(Producer extends
和 Consumer super
的缩写)。
谁能给我解释一下如何使用 PECS 来解决 extends
和 super
之间的混淆?
最佳答案
tl;dr: “PECS”是从 Collection 的角度来看的。如果您仅从通用集合中提取项目,则它是生产者,您应该使用 extends
;如果您仅在其中填充元素,则它是消费者,您应该使用 super
.如果你同时使用同一个集合,你不应该使用 extends
或 super
.
假设您有一个方法,其参数是一组事物,但您希望它比仅接受 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/