2013-04-19 10 views
5

Ho ricevuto un messaggio di avviso su Object Casting durante la compilazione del mio codice. Non ho idea di come risolvere il problema con la mia conoscenza attuale .... Diciamo che ho un oggetto generico MyGenericObj<T> è si estende da un oggetto non generico MyObjQual è il modo corretto per verificare il tipo di oggetto per l'oggetto generico?

Ecco un codice di esempio:

MyObj obj1 = new MyGenericObj<Integer>(); 
if (obj1 instanceof MyGenericObj) { 
    //I was trying to check if it's instance of MyGenericObj<Integer> 
    //but my IDE saying this is wrong syntax.... 
    MyGenericObj<Integer> obj2 = (MyGenericObj<Integer>) obj1; 
    //This line of code will cause a warning message when compiling 
} 

Potrebbe per favore farmi sapere qual è il modo corretto di farlo?

Qualsiasi aiuto è apprezzato.

risposta

6

A causa di type erasure, non c'è modo di farlo: MyGenericObj<Integer> è in realtà un MyGenericObj<Object> dietro la scena, indipendentemente dal suo parametro di tipo.

Un modo per aggirare questo sarebbe l'aggiunta di una proprietà Class<T> al vostro oggetto generico, in questo modo:

class MyGenericObject<T> { 
    private final Class<T> theClass; 
    public Class<T> getTypeArg() { 
     return theClass; 
    } 
    MyGenericObject(Class<T> theClass, ... the rest of constructor parameters) { 
     this.theClass = theClass; 
     ... the rest of the constructor ... 
    } 
} 

Ora è possibile utilizzare getTypeArg per trovare la classe attuale del parametro tipo, confrontarlo con Integer.class, e prendere una decisione in base a questo.

+0

Primo grazie per il vostro aiuto. Quindi intendi nell'oggetto 'theClass', hai un posto dove salvare il tipo di oggetto, quindi lo paragoniamo a 'Integer.class'? – user2296188

+0

@ user2296188 In sostanza, sì, si scrive qualcosa come: 'if (i instanceof MyGenericObject && ((MyGenericObject) i) .getTypeArg() == Integer.class) {...}'. Dai un'occhiata a questa demo su ideone ([link] (http://ideone.com/j85Uj9)) per un esempio funzionante. – dasblinkenlight

+0

L'ho capito ora ~~ Grazie mille !!! Lo proverò e vedrò se il messaggio di avviso è stato cancellato ... – user2296188

Problemi correlati