Question: Reading Java Essentials, 2nd edition, there's a rule called PECS for type safety in method parameters. If it produces you extend, consumes you use super. Sorry if I defined it wrong as I don't get it.

Can anyone shed light on what Joshua Bloch is referring to as the producer/consumer?

Answer: 
See this [pdf](http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-6623.pdf) which has a series of slides on this (search for PECS):

**Generic types are invariant**

• That is, `List<String>` is not a subtype of `List<Object>`  

• Good for compile-time type safety, but inflexible 

**Bounded wildcard types provide additional API flexibilty**

• `List<String>` is a subtype of `List<? extends Object>`  

• `List<Object>` is a subtype of `List<? super String>`

so

*PECS* — *Producer extends, Consumer super* 

• use `Foo<? extends T>` for a `T` producer  

• use `Foo<? super T>` for a `T` consumer

only applies to input parameters (Don’t use wildcard types as return types).

Suppose you want to add bulk methods to Stack:

```
void pushAll(Collection<? extends E> src);
//src is an E producer

void popAll(Collection<? super E> dst);
// dst is an E consumer

```
When a method reads/iterates over elements in a collection then it is a consumer, when it ads to a collections then it is a producer.