java - What is PECS (Producer Extends Consumer Super)?
itemprop="text">
I came across PECS (short
for Producer extends and Consumer
super) while reading up on generics.
Can someone explain to me how to use PECS to
resolve confusion between extends and
super?
class="post-text" itemprop="text">
tl;dr: "PECS" is
from the collection's point of view. If you are only pulling items
from a generic collection, it is a producer and you should use
extends; if you are only stuffing items
in, it is a consumer and you should use super. If you do both
with the same collection, you shouldn't use either extends or
super.
/>
Suppose you have a method that takes as its
parameter a collection of things, but you want it to be more flexible than just
accepting a
Collection.
Case
1: You want to go through the collection and do things with each
item.
Then the list is a
producer, so you should use a Collection extends Thing>.
The reasoning is
that a Collection could hold any subtype
of Thing, and thus each element will behave as a
Thing when you perform your operation. (You actually cannot add
anything to a Collection, because you
cannot know at runtime which specific subtype of
Thing the collection
holds.)
Case 2: You want to add
things to the collection.
Then the list is a
consumer, so you should use a Collection super Thing>.
The reasoning here
is that unlike Collection,
Collection can always hold a
Thing no matter what the actual parameterized type is. Here you
don't care what is already in the list as long as it will allow a
Thing to be added; this is what ? super
Thing guarantees.
No comments:
Post a Comment