For maximum flexibility, use wildcard types on input parameters that represent producers or consumers.
Mnemonic:
PECS stands for producer-extends, consumer-super.
E.g., method that takes a sequence of elements and pushes them all onto the stack:
// pushAll method without wildcard type - deficient!
public void pushAll(Iterable<E> src) {
for (E e : src) {
push(e);
}
}
should be re-written:
// Wildcard type for parameter that serves as an E producer
public void pushAll(Iterable<? extends E> src) {
for (E e : src) {
push(e);
}
}
Similarly, a method that pops each element off the stack and adds the elements to the given collection:
// popAll method without wildcard type - deficient!
public void popAll(Collection<E> dst) {
while (!isEmpty()) {
dst.add(pop());
}
}
should be re-written:
// Wildcard type for parameter that serves as an E consumer
public void popAll(Collection<? super E> dst) {
while (!isEmpty()) {
dst.add(pop());
}
}