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%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.
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
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.
Tags und Links java reflection