2009-05-21 7 views
5

Sono abbastanza a mio agio con i generici e così via, ma in questo caso speciale ho una domanda riguardante l'avviso "Tipo sicurezza: cast non selezionato da .. a ..".Tipo di sicurezza: cast non controllato tra gli oggetti di classe

Fondamentalmente ho una lista di oggetti di classe e ora voglio ottenere un sottoinsieme di questi che implementano un'interfaccia speciale, ma la lista risultante dovrebbe avere anche quella speciale Tipo:

... 
private List<Class<?>> classes; 

public List<Class<? extends Concrete>> getConcreteClasses() { 

    List<Class<? extends Concrete>> concreteClasses = new LinkedList<Class<? extends Concrete>>(); 

    for (Class<?> clazz: this.classes) { 
     for (Class<?> i : clazz.getInterfaces()) { 
      if (i.equals(Concrete.class)) { 
       concreteClasses.add((Class<? extends Concrete>) clazz); 
      } 
     } 
    } 

    return concreteClasses; 

} 

L'avvertimento è, naturalmente, relative al tipo colato:

Type safety: Unchecked cast from Class<?> to Class<? extends Concrete> 

posso liberarmi di tipo colato o dovrei eliminare l'avviso con @SuppressWarnings ("incontrollato")?

Grazie per le risposte!

PS: L'ambiente è Java 6.

Soluzione: Invece di

concreteClasses.add((Class<? extends Concrete>) clazz); 

uso

concreteClasses.add(clazz.asSubclass(Concrete.class)); 
+0

Ottima risposta, mi ha salvato la vita qui. –

risposta

5
+0

Grazie! In realtà ho già usato asSubclass() in un altro pezzo di codice .... ooops: D – letmaik

+0

Non sorprenderti se devi sopprimere gli avvisi altrove usando il reflection. (Come sempre, la riflessione è cattiva). –

0

È possibile eliminare gli avvisi, perché si sono sicuro del cast funzionerà perché tutte le classi che aggiungi implementano l'interfaccia Concrete ...

Problemi correlati