Tuesday, 19 April 2011

The Get and Put Principle in bounded wildcard (Generics)

Use extends only when you intend to get values out of a structure or Collection, use super only when you intend to put values into a structure or Collection.
This also implies: don’t use any wildcards when you intend to both get and put values into and out of a structure.

// Copy all elements, subclasses of T, from source to dest 
//which contains elements that are superclasses of T.public static <T> void copy(List<? super T> dest, List<? extends T> source) {
for (int i = 0; i < source.size(); i++) {
dest.set(i, source.get(i));
}
}

// Extends wildcard violationList<Integer> integers = new LinkedList<Integer>();
List<? extends Number> numbers = integers;
numbers.get(i); // Works fine!numbers.add(3); // Won't compile!
// Super wildcard violationList<Number> numbers = new LinkedList<Number>();
List<? super Integer> integers = numbers;
numbers.add(3); // Works fine!int i = numbers.get(0); // Won't' compile!Object o = numbers.get(0); // Works fine since object is the upper bound!

No comments:

Post a Comment