Tricky.
output = process( input ); //error!!
because output is of type List<Integer> and process returns <? super Integer> when invoked with a List<Integer>.
You cannot assign like this;
List<Integer> li_int = null;
List<? super Integer> li_sup = null;
li_int = li_sup; // not allowed
Because li_sup could also refer to a List<Object>.
In the method:
public static <E extends Number> List<? super E> process( List<E> nums)
{...
return type depends on the type the list is invoked with.
You can easily invoke this method with a List<Float>.
So it is not allowed to return a List<Integer> because Integer is not a Float itself nor a supertype thereof.
Note that it doesn't depend on how you invoke the process method in your main method. It has to be consistant on all possible invokations.
As I said in the beginning:
Tricky.
Yours,
Bu.