What is PECS (Producer Extends Consumer Super)?
bounded-wildcard, generics, java, pecs, super
Solution
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<Thing>`.
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<? extends Thing>` 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 (except null) to a `Collection<? extends Thing>`, 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<? extends Thing>`, `Collection<? super Thing>` 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.
Problem
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`?
Related problems
- What is the difference between covariance and contra-variance in programming languages?
- What is a difference between <? super E> and <? extends E>?
- structure vs class in swift language
- Java generics: Collections.max() signature and Comparator
- How to check covariant and contravariant position of an element in the function?
- Java 8 Comparator comparing static function