To quote Josh Bloch in "Effective Java" third Edition item 31:
Example:
should be replaced with:
void process(Consumer<Number> consumer);
This method signature is more flexible because it accepts more types (not only Consumer<Number> but also Consumer<Object>).
void process(Consumer<? super Number> consumer);
Likewise, type parameters in covariant position:
should be replaced with:
T produce(Producer<T> p);
T produce(Producer<? extends T> p);