2010-08-04 15 views
8

Ich habe ein Problem mit begrenzten verschachtelten Platzhalter in Java Generics.Java geschachtelte Wildcard generische wird nicht kompilieren

Hier ist ein häufiger Fall:

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

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

Dies ist Standard-Java-Generika, funktioniert gut.

jedoch, wenn die Platzhalter verschachtelt werden, ist es nicht mehr funktioniert:

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

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

Dies zu einem Compiler-Fehler führt.

Ich habe eine Vielzahl von Casts und Platzhalterpermutationen ausprobiert, aber ich kann das nicht funktionieren. Ich kann mich nicht erinnern, dieses Thema schon einmal gesehen zu haben, und ich habe jahrelang mit Generika gearbeitet. Bin ich einfach zu müde und vermisse etwas Offensichtliches?

+0

Es gibt eine Erklärung dafür in den Java Generics FAQ: http://www.angelikalanger.com/GenericsFAQ/FAQSections /TypeArguments.html#FAQ104 –

Antwort

15

Das Problem ist also, doSomething als umgesetzt werden könnten:

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

Sie müssen entscheiden, was Sie wirklich bedeuten.

Wahrscheinlich so etwas wie:

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

Ja, das habe ich einfach selbst realisiert. Ich hätte schwören können, dass ich das gestern versucht habe, aber ich hatte wahrscheinlich eine andere subtile Veränderung. – nilskp

0

Um Code vornehmen arbeiten erstellen HashMap wie:

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

dies für Sie arbeiten:

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