Wildcards are only really useful in method parameter declarations, as they increase the range of acceptable 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>()); // OK.
original(new ArrayList<Integer>()); // Compiler-error.
original(new ArrayList<Object>()); // Compiler-error.
withUpperWildcard(new ArrayList<Number>()); // OK.
withUpperWildcard(new ArrayList<Integer>()); // OK.
withLowerWildcard(new ArrayList<Number>()); // OK.
withLowerWildcard(new ArrayList<Object>()); // OK.
Wildcards in return types make life difficult (or, rather, messy) for users of your class, since you have to either propagate them, or do explicit work to make them go away, for example:
List<? extends Number> method() { /* ... */ }
// Compiler error.
List<Number> list1 = method();
// OK, but yuk!
List<? extends Number> list2 = method();
// OK, but the list gets copied.
List<Number> list3 = new ArrayList<Number>(method());
Wildcards in your local variables just aren't necessary (except to accept the results of wildcard-returning methods).
To quote Effective Java 2nd Ed:
If the user of a class has to think about wildcard types, there is probably something wrong with the class’s API.