Ich versuche, eine HashMap<String, Number>
über Reflexion zuzugreifen:Casting Zahl zu verdoppeln primitive
Serializable obj; //here goes the HashMap
String name;
...
return (double)obj.getClass().getDeclaredMethod("get", Object.class).invoke(obj, name);
aber bisher alles, was ich habe ist ein Gussfehler oben durch die Linie verursacht:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
Tat der Kennfeldwert, der durch den Schlüssel name
zugegriffen wurde, war Integer
.So ich die Zeile geändert haben:
return obj.getClass().getDeclaredMethod("get", Number.class).invoke(obj, name).doubleValue();
aber das hat auch nicht geklappt. Ich habe sogar doubleValue()
unterstrichen als "undefiniert für den Typ Objekt" (aber warum Objekt, wenn ich Number.class habe?).
Ich bin mir nicht sicher, welche Casting-Regeln ich breche. Kann mir bitte jemand helfen, wenn meine Karteneinträge verschiedene Zahlenwerte haben (Integer
, Float
, Double
) aber ich brauche die Methode, um einen double
Wert (primitiv) zurückzugeben.
PS Es ist nicht wirklich ein Duplikat. Meine Frage ist allgemeiner. Aber danke für deine Anregungen. Ich habe vergessen, dass der Aufruf immer Objekt zurückgibt.
Der Arbeitscode lautet:
return ((Number)obj.getClass().getDeclaredMethod("get", Object.class).invoke(obj, name)).doubleValue();
Was ist der Rückgabetyp von 'invoke'? Hat dieser Typ eine 'doubleValue' Methode? –
Sie könnten einfach in "Integer" umwandeln und der Compiler wird dafür sorgen, dass die Konvertierung für Sie "doppelt" wird. Andernfalls wird nach "Integer" oder "Number" umgewandelt und dann die Methode "doubleValue" aufgerufen. –
@Sotirios Delimanolis Der Rückgabetyp sollte Zahl sein, da ich versuche, das Number-Element von einer HashMap zu erhalten. Also sollte es eine DoubleValue-Methode haben. Der tatsächliche Wert des HashMap-Elements ist in diesem Fall Integer, wie ich zuvor geschrieben habe. – Vic