From http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ103:
A wildcard with a lower bound looks like " ? super Type " and stands for the family of all types that are supertypes of Type , type Type being included. Type is called the lower bound .
So why
ArrayList<? super Number> psupn1 = new ArrayList<Number>();
psupn1.add(new Double(2));
compiled?
Double is not supertype of Number but subclass of Number...
Edit 1:
ArrayList<? super Number> pextn1 = new ArrayList<Number>();
psupn1.add(new Integer(2));
psupn1.add(new Double(2));
psupn1.add(new Float(2));
for(Number n : psupn1){ // [Invalid] Number should be change to
// Object even if I can only add subtype of Number??
}