2013-01-09 15 views
16

Possible Duplicate:
Java: Instanceof and Genericsperché instanceof non funziona con Generic?

Sto provando a scrivere una funzione che esegue un elenco generico a un elenco di tipi specifici. Trova il codice qui sotto

public <T>List<T> castCollection(List srcList, Class<T> clas){ 
    List<T> list =new ArrayList<T>(); 
    for (Object obj : srcList) { 
     if(obj instanceof T){ 
      ... 
     } 
    } 
    return list; 
} 

Ma obj instanceof T che mostra un errore di compilazione -

Cannot perform instanceof check against type parameter T. Use instead its erasure Object >instead since further generic type information will be erased at runtime.

qualsiasi chiarimento o un modo per ottenere il risultato desiderato?

Grazie in anticipo. :)

+1

.. perché non hai cercato (-1); prova '[java] generic instanceof' http://stackoverflow.com/questions/1570073/java-instanceof-and-generics, http://stackoverflow.com/questions/13768049/use-instanceof-in-a-generic- modo, http://stackoverflow.com/questions/8741984/why-t-instanceof-t-is-not-allowed-where-t-is-a-type-parameter-and-t-is-a-varia? lq = 1, http://stackoverflow.com/questions/4397660/generics-and-instanceof-java?rq=1 (etc) –

risposta

33

Non puoi farlo in questo modo. Per fortuna, si dispone già di un argomento Class<T> così invece fare

myClass.isAssignableFrom(obj.getClass()) 

Ciò restituirà vero se obj è di classe myClass o sottoclasse.

Come indicato da @ILMTitan (grazie), è necessario verificare obj == null per evitare una potenziale NullPointerException oppure utilizzare myClass.isInstance(obj). O fa quello che ti serve.

+5

Ciò può causare un puntatore nullo di obj è 'null'. 'isInstance()' non causerà il problema del puntatore nullo. – ILMTitan

2

I tipi generici saranno erased dopo la compilazione (i generici sono per la sicurezza del tipo di tempo di compilazione) e saranno sostituiti con il tipo più applicabile dopo la compilazione.

Se si vuole fare questa compilazione, sostituire T con tipo concreto, ad esempio

obj instance String 
4

T è un tipo parametrico ed esiste per scopi di compilazione. Non esiste in fase di esecuzione a causa della cancellazione dei tipi.

Pertanto, obj instanceof T non è legale.

4

Poiché java utilizza la cancellazione, non è possibile utilizzare i tipi generici per il controllo.

Per ottenere il risultato desiderato, utilizzare Class.isInstance().

7

Risposta breve: perché un parametro di tipo in Java è qualcosa appena usato dal compilatore per garantire la sicurezza del tipo.

In fase di runtime, le informazioni sui tipi generici vengono scartate a causa della cancellazione dei tipi ma instanceof è un controllo di runtime che richiede un tipo concreto (non una variabile di tipo) per funzionare.

+0

Esiste un analogo 'instanceof' per il controllo in fase di compilazione? Nel mio caso, sto provando a lanciare un 'ClassCastException' come parte della mia definizione del metodo' add' di 'Queue'. Il mio primo pensiero è stato 'instanceof', ma durante la compilazione ho ottenuto' error: type generico illegale per instanceof'. – Ungeheuer

+0

@Ungeheuer Si dovrebbe limitare la variabile di tipo. – Jack