Dúvida com questão de Generics

Ae galerinha

Porque esse código não compila?

Fiquei aqui pensando, mais não descobri o porque ainda

[code]

Map<List,? extends Number> map = new HashMap<List,Number>();
map.put(new ArrayList(), 1);
map.put(new ArrayList(), 12);
map.put(new LinkedList(), new Integer(1));
map.put(new LinkedList(), new Long(1));[/code]

Se alguem ae puder ajudar, ficarei grato

Até +

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…

Corretíssima a explicação. Só é permitido adicionar itens em Generics quando se utiliza a keyword super, dessa forma:

Map<List<Integer>,? super Number> map = new HashMap<List<Integer>,Number>();  

Nesse caso, pode-se adicionar instâncias de Number e superclasses de Number