我在阅读泛型时遇到了 PECS( 生产者 extends
和消费者 super
的缩写)。
有人可以向我解释如何使用 PECS 来解决 extends
和 super
之间的混淆吗?
原文由 peakit 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在阅读泛型时遇到了 PECS( 生产者 extends
和消费者 super
的缩写)。
有人可以向我解释如何使用 PECS 来解决 extends
和 super
之间的混淆吗?
原文由 peakit 发布,翻译遵循 CC BY-SA 4.0 许可协议
这背后的原理在计算机科学中被称为
? extends MyClass
,? super MyClass
和MyClass
下面的图片应该解释这个概念。图片提供: Andrey Tyukin
原文由 anoopelias 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
tl;dr: “PECS”是从收藏的角度来看的。如果你 只是 从一个通用集合中提取项目,它是一个生产者,你应该使用
extends
;如果你 只是 往里面塞东西,它就是一个消费者,你应该使用super
。如果您对同一个集合执行这两项操作,则不应使用extends
或super
。假设您有一个方法将一组事物作为其参数,但您希望它比仅接受
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
保证。