2015-01-09 16 views
8

Durante l'utilizzo di Spring ApplicationContext e il suo metodo getBeansOfType ho riscontrato un problema con tipi generici. Ciò dimostra il problema:Come ottenere la conversione da List <SomeParamType> a List <SomeParamType <?>>

class Test 
{ 
    List<Generator<?>> allGenerators = 
     new ArrayList(getBeansOfType(Generator.class).values()); // Raw type warning 
                   // for new ArrayList() 
    <T> Map<String, T> getBeansOfType(Class<T> klass) { 
    return emptyMap(); 
    } 
} 

interface Generator<R> {} 

Recupero tutti i bean di un tipo parametrico dal contenitore. Voglio averli come Generator<?> e utilizzare la logica personalizzata per trasmettere in sicurezza al parametro di tipo appropriato basato su una proprietà su ciascuna istanza Generator.

Il mio problema è che non riesco a trovare alcun modo per assegnare a allGenerators senza avvisi di sicurezza del tipo, anche se a livello concettuale non mi sto impegnando in alcun parametro di tipo non controllato. Voglio solo convertire un tipo non elaborato in un tipo jolly.

C'è qualche idioma che non richiede @SuppressWarnings per arrivarci?

risposta

3

Non in realtà una conversione, ma un programma che crea un elenco del tipo richiesto senza avvisi:

public List<Generator<?>> solution() { 
    List<Generator<?>> dst = new ArrayList<>(); 
    for (Generator<?> g : getBeansOfType(Generator.class).values()) { 
     dst.add(g); 
    } 
    return dst; 
} 
+1

Ma questo dà chiaramente un avviso di "tipo grezzo" su 'Generatore g'. Puoi disattivare questo avviso in Eclipse, ma non è quello che sto puntando. –

+0

@MarkoTopolnik sembra ok se uso 'Generator ' come tipo di 'g' (almeno, il codice viene compilato e non ricevo alcun avviso) – Raffaele

+0

Devi abilitare -Xlint: deselezionato nelle impostazioni del compilatore in IntelliJ per visualizzare l'avviso o compilarlo manualmente con questa impostazione abilitata. –

1

Suppongo che non è possibile (per convertire un tipo grezzo ad uno con un parametro jolly).

La ragione è che il tipo generico (e in particolare, il carattere jolly) è qualcosa di diverso da un tipo classe e non può essere rappresentato con gli strumenti di tipi di classe.

Problemi correlati