Opa, beleza ?
Então, o código não compila por causa do uso do wildcard na referência do seu Map :
Map<List<Integer>,? extends Number> map = ... // ? extends Number
A utilização do ? quer dizer que, qualquer Map em que o objeto Value seja Number (É-UM), então pode ser atribuido a essa referência.
exemplo:
Map<List<Integer>,? extends Number> map2 = new HashMap<List<Integer>,Integer>(); // pode passar um Integer
Map<List<Integer>,? extends Number> map3 = new HashMap<List<Integer>,Long>(); // pode passar um Long
Justamente por essa característica, ao utilizar o ? na sua referencia, você não pode adicionar nenhum objeto ao seu Map.
Isso porque você não sabe qual será o tipo de Map.
Ex: você iria adicionar um Long no seu map, mas na verdade, essa sua referência aponta para um HashMap<List,Integer>. Logo, para evitar isso, o compilador não permite adicionar nada.
Map<List<Integer>,? extends Number> map = new HashMap<List<Integer>,Long>();
map.put(new ArrayList<Integer>(), new Integer(15)); // não podemos adicionar um Integer. Sabemos que o Map tem como Value um (? extends Number),
// mas não sabemos que tipo exatamente ele é. Como no exemplo, ele poderia ser um Long.
Obs: Na verdade, utilizando wildcard (?) você poderá adicionar apenas uma coisa: null.
Não sei se consegui explicar muito bem. Acho que a galera pode ter umas explicações melhores.
flws…