2013-04-19 2 views
5

Ich habe eine Nachricht über Objektcasting bekommen, während ich meinen Code kompiliert habe. Ich habe keine Ahnung, wie man es beheben mit meinem aktuellen Wissen .... Lassen Sie uns sagen, ich habe ein generisches Objekt MyGenericObj<T> es erstreckt sich von einem nicht-Generic Object ist MyObjWas ist der richtige Weg, um den Objekttyp für Generisches Objekt zu überprüfen?

Hier ist ein Beispielcode:

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 
} 

Könnten Sie mir bitte mitteilen, wie dies richtig funktioniert?

Jede Hilfe wird geschätzt.

Antwort

6

Wegen type erasure gibt es keine Möglichkeit, das zu tun: MyGenericObj<Integer> ist eigentlich ein MyGenericObj<Object> hinter der Szene, unabhängig von seinem Typ Parameter.

Ein Weg, um dies würde das Hinzufügen einer Class<T> Eigenschaft zu Ihrem generisches Objekt, wie folgt aus:

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 ... 
    } 
} 

Jetzt können Sie getTypeArg verwenden, um die tatsächliche Klasse des Typs Parameter zu finden, zu vergleichen, um es zu Integer.class und Auf dieser Grundlage eine Entscheidung treffen.

+0

Zuerst Danke für Ihre Hilfe. Also meinst du im 'theClass'-Objekt, du hast einen Platz um den Objekttyp zu speichern, dann vergleichst du das mit' Integer.class '? – user2296188

+0

@ user2296188 Im Wesentlichen ja - Sie schreiben etwas wie folgt: 'if (i instanceof MyGenericObject && ((MyGenericObject) i) .getTypeArg() == Integer.class) {...}'. Werfen Sie einen Blick auf diese Demo auf ideone ([link] (http://ideone.com/j85Uj9)) für ein funktionierendes Beispiel. – dasblinkenlight

+0

Ich habe es jetzt ~~ Vielen Dank !!! Ich werde es ausprobieren und sehen, ob die Warnmeldung gelöscht wird ... – user2296188

Verwandte Themen