Thursday, 7 December 2017

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">
class="normal">Answer




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

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print ...