2010-08-04 19 views
8

J'ai un problème avec les caractères génériques imbriqués bornés dans les génériques Java.Java générique joker imbriqué ne compilera pas

est ici une affaire commune:

public void doSomething(Set<? extends Number> set) {} 

public void callDoSomething() { 
    Set<Integer> set = new HashSet<Integer>(); 
    doSomething(set); 
} 

C'est générique Java standard, fonctionne très bien.

Toutefois, si le caractère générique devient imbriqué, il ne fonctionne plus:

public void doSomething(Map<String, Set<? extends Number>> map) {} 

public void callDoSomething() { 
    Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>(); 
    doSomething(map); 
} 

Cela conduit à une erreur du compilateur.

J'ai essayé une variété de conversions et de permutations génériques, mais je n'arrive pas à faire fonctionner cela. Je ne me souviens pas avoir vu ce problème auparavant, et j'ai travaillé avec les génériques pendant des années. Suis-je juste trop fatigué et manque quelque chose d'évident?

+0

Il y a une explication pour cette dans la FAQ de Java Generics: http://www.angelikalanger.com/GenericsFAQ/FAQSections /TypeArguments.html#FAQ104 –

Répondre

15

Le problème est, doSomething pourrait être mis en œuvre comme:

public void doSomething(Map<String, Set<? extends Number>> map) { 
    Set<Float> set = ...; 
    map.put("xyz", set); 
} 

Vous devez décider ce que vous entendez réellement.

Probablement quelque chose comme:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {} 
+0

Oui, je l'ai réalisé de manière indépendante. J'aurais pu jurer que j'ai essayé cela hier, mais j'ai probablement eu un autre changement subtil. – nilskp

0

Pour rendre le code à travailler Créer HashMap comme:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>(); 
1

cela fonctionnera pour vous:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}