PECS (producer extends, consumer super) is an easy way to remember how to use the keywords "extends" and "super" in generics.
First of all, <? extends Number> means that Number and Integer are valid types, but not Object. <? super Number> means that Number and Object are valid types, but not Integer.
The rule is that <? extends Number> should be used for producers, whereas <? super Number> should be used for consumers.
A producer is used to insert values, whereas a consumer is used to read values.
Some examples will make it clear.
List<? extends Number> list = new ArrayList<>( Arrays.asList(new Integer[]{1,2,3})); Number num = list.get(1);
However I cannot insert any value:
list.add(1); // Compilation error
Null is the only value that can be inserted:
list.add(null); // Ok!
List<? super Number> list = new ArrayList<>()); list.add(1); list.add(4.0f);
However the following instruction generates a compilation error:
Number num = list.get(1); // Compilation error
The only way to read a producer is by using Object:
Object obj = list.get(1); // Ok!
Consumers and producers can be used as parameters:
public void myMethod(List<? super Number> list) {
You should use:
Copyright © 2013 Welcome to the website of Davis Fiore. All Rights Reserved.