the loop doesn't work as the list is accessed through a reference of type <? extends Number>. So the return values will be of type Number. So the loop would try to assign a Number to an Integer. It is true that the actual List is of type Integer, but the compiler would check the loop by the reference whose type is <? extends Number> not <Integer>. So basically you are trying to do something like this
Integer i = (Number)list.get(0);
This would not compile as you know. Also you CAN use wildcard and Identifier form of together...