The Get and Put principle: Use an extends wildcard when you only get values from the structure. Use a super wildcard when you only put values into the structure. Don't use a wildcard when you both get and put values from/into the structure.The best example of this principle is the following copy method signature:
public static <T> void copy(The method gets values out of the source, so source uses extends, and it puts values into the destination, so that is declared with the super wildcard.
Collection<? super T> destination,
Collection<? extends T> source);