Wie vergleiche ich Klassen mit Reflektion?

8

Ich versuche, den Klassen-Typ einer Klasse durch Reflexion zu bestimmen und dann etwas Bestimmtes zu tun. Wenn die Klasse beispielsweise ein Double-Objekt ist, verwenden Sie eine doppelte Methode.

Ich versuche,

zu verwenden %Vor%

Ich bekomme jedoch einen Compilerfehler:

"Inkompatible Operandentypen Class & lt; capture # 1-of" erweitert Field & gt; und Class & lt; Double & gt; "

Was ist der richtige Weg, dies zu tun?

Edit: um klarer zu sein

f ist vom Typ Field. durch Reflexion in einer Schleife erhalten

%Vor%     
kgrad 05.05.2009, 16:09
quelle

5 Antworten

6

Interessante Fehlermeldung (Ich wusste nicht '==' Operator würde diese überprüfen). Aber basierend darauf vermute ich, dass Ihr Vergleich falsch ist: Sie versuchen zu sehen, ob Field-Klasse (theoretisch seine Super-Klasse, aber nur in der Theorie - Feld ist endgültig) ist das gleiche wie Double.class, was es nicht sein kann .

Also: ja, der Vergleich sollte funktionieren, wenn Sie ihm richtige Argumente geben. Also ich vermute, du willst es tun:

if (f.getType () == Double.class)

stattdessen. Und das sollte funktionieren, da Double eine letzte Klasse ist. Andernfalls wäre "isAssignableFrom" geeigneter.

    
StaxMan 05.05.2009, 16:28
quelle
3

Wenn Sie Objekte haben, verwenden Sie

%Vor%

Eine weitere interessante Sache ist die Methode isAssignableFrom:

%Vor%

Aber im Allgemeinen ist es ein schlechter Stil. Verwenden Sie Polymorphie, um Logik zu implementieren, die von Klassentypen abhängt.

Antwort für Kommentar: f instanceof Double funktioniert gut.

Sie haben wahrscheinlich so etwas geschrieben:

%Vor%

Und ein intelligenter Java-Compiler sagt, dass Sie CE haben. ABER:

%Vor%

.. das funktioniert gut

    
Roman 05.05.2009 16:19
quelle
1

Sie sollten getType () verwenden, um den zugrunde liegenden Typ zu erhalten, nicht die Klasse. getType () gibt die Klasse des zugrunde liegenden Typs wie erforderlich zurück.

Der Code sieht so aus:

%Vor%     
kgrad 05.05.2009 16:24
quelle
1

Der einfachste Weg wäre

%Vor%

Bearbeiten: Ah, jetzt sehe ich das Problem. Der Fehler, den Sie bekommen haben, war, weil der Compiler (aufgrund von Generics) sagen konnte, dass die Klassen niemals gleich sein würden ( Field.class kann nicht gleich Double.class sein). Die Verwendung von .equals () verwandelt es in eine Warnung anstelle eines Fehlers, aber es ist immer noch falscher Code.

Field.getType() gibt Ihnen den Typ des Feldes. Da dies zur Kompilierzeit nicht bekannt sein kann, erhalten Sie keinen Fehler, wenn Sie den Operator == wie ursprünglich verwendet verwenden.

    
Michael Myers 05.05.2009 16:12
quelle
0

Das folgende Code-Snippet sollte perfekt funktionieren:

%Vor%

Übrigens funktioniert weder == noch equals für Anzahl -Typen gemäß meinem Test (JRE7)

    
Jiang Run 29.04.2014 13:42
quelle

Tags und Links