2010-08-04 41 views
8

Ho un problema con i caratteri jolly nidificati limitati in generici Java.jolly nidificato Java generico non verrà compilato

Ecco un caso comune:

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

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

Si tratta di farmaci generici standard di Java, funziona bene.

Tuttavia, se il jolly diventa nidificato, non funziona più:

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

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

Questo porta ad un errore del compilatore.

Ho provato una varietà di cast e permutazioni con caratteri jolly, ma non riesco a farlo funzionare. Non ricordo di aver visto prima questo problema, e ho lavorato con i generici per anni. Sono semplicemente troppo stanco e mi manca qualcosa di ovvio?

+0

C'è una spiegazione per questo nelle FAQ di Java Generics: http://www.angelikalanger.com/GenericsFAQ/FAQSections /TypeArguments.html#FAQ104 –

risposta

15

Quindi il problema è, doSomething potrebbero essere attuate come:

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

È necessario decidere ciò che effettivamente dire.

Probabilmente qualcosa di simile:

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

Sì, l'ho capito in modo indipendente. Avrei giurato di averlo provato ieri, ma probabilmente ho avuto qualche altro piccolo cambiamento. – nilskp

0

per rendere il codice a lavorare Creare HashMap come:

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

questo lavoro per voi:

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