Imagine what would happen with the following code, if the code you provided was legal:
List<Double> listDouble = new ArrayList<Double>(); doInsert(listDouble); Double d = listDouble.get(0); //ClassCastException!
The compiler adds an implicit cast at the last line. This cast fails at runtime, and this breaks the type safety guarantee of generics, because the compiler didn't save you from ruining the list contents and your data type assumptions. It was supposed to hold only Double values, but an integer found a way inside.
Your options:
doInsert(List<? extends Number> myList)
Allows iterating over Numbers, but not adding to the collection. Accepts list defined on any subtype of Number.
doInsert(List<Number> myList)
Allows iterating and modifying, but only accepts lists defined exactly as List<Number>.
doInsert(List<? super Number> myList)
Allows iterating over the items (as Object), and allows adding any kind of Number. Accepts only lists of Number of its ancestors (what makes it practically useless in this case).
Integerinto a list ofImaginaryNumbers?doInsert(new ArrayList<Short>()), for example.