什么是 PECS(生产者扩展消费者超级)?

新手上路,请多包涵

我在阅读泛型时遇到了 PECS( 生产者 extends 和消费者 super 的缩写)。

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

原文由 peakit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 789
2 个回答

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 保证。

原文由 Michael Myers 发布,翻译遵循 CC BY-SA 4.0 许可协议

这背后的原理在计算机科学中被称为

  • 协方差: ? extends MyClass
  • 逆变: ? super MyClass
  • 不变性/非变化性: MyClass

下面的图片应该解释这个概念。图片提供: Andrey Tyukin

协变与逆变

原文由 anoopelias 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏