在阅读泛型时,我遇到了PECS(生产者extends和消费者的super缩写)。
PECS
super
有人可以向我解释如何使用PECS解决extends和之间的混淆super吗?
extends
tl; dr: “ PECS”是从集合的角度来看的。如果仅从通用集合中提取项目,则它是生产者,应使用extends; 如果您仅将物品塞入其中,则它是消费者,应该使用super。如果您都使用同一集合,则不应使用extends或super。
假设您有一个方法以事物的集合为参数,但是您希望它比只接受一个更加灵活Collection。
情况1:您想浏览集合并为每个项目做事。 然后列表是生产者,因此您应该使用Collection<? extends Thing>。
Collection<? extends Thing>
原因是a Collection<? extends Thing>可以包含的任何子类型Thing,因此每个元素Thing在执行操作时都将表现为a 。(实际上,您无法将任何内容添加到中Collection<? extends Thing>,因为您无法在运行时知道该集合包含哪种特定的子类型Thing。)
a Collection<? extends Thing>
情况2:您想向集合中添加东西。 那么列表是一个消费者,因此您应该使用Collection<? super Thing>。
Collection<? super Thing>
这里的理由是,与不同Collection<? extends Thing>,无论实际的参数化类型是什么,Collection<? super Thing>都可以始终保持Thing。在这里,您不必关心列表中已经存在的内容,只要Thing可以添加即可。这就是? super Thing保证。