Wildcards are really only useful in method parameter declarations, as they increase the range of valid parameter types, for example:
void original(List<Number> list) { }
void withUpperWildcard(List<? extends Number> list) { }
void withLowerWildcard(List<? super Number> list) { }
original(new ArrayList<Number>());
original(new ArrayList<Integer>());
original(new ArrayList<Object>());
withUpperWildcard(new ArrayList<Number>());
withUpperWildcard(new ArrayList<Integer>());
withLowerWildcard(new ArrayList<Number>());
withLowerWildcard(new ArrayList<Object>());
(, , ) , , , , :
List<? extends Number> method() { }
List<Number> list1 = method();
List<? extends Number> list2 = method();
List<Number> list3 = new ArrayList<Number>(method());
( , ).
Java 2nd Ed:
, , - API .