2017-02-13 2 views
0

Ich möchte Java-Reflektion verwenden, um den zurückgegebenen Wert einer Methode in eine double zu konvertieren, unabhängig davon, ob der tatsächliche Rückgabetyp eine Zahl oder eine primitive int, long, float, double usw.Java-Reflexion. Konvertieren zurückgegebenen Wert zu double

ist

um sicherzustellen, dass das Verfahren einen Wert tatsächlich zurückkehrt, die ich in einen doppelten umwandeln kann, ich

List<String> numberTypes = Arrays.asList("int", "Integer", "double", "Double", "long", "Long", "float", "Float"); 
if (numberTypes.contains(method.getReturnType().getSimpleName())){ 
    Double a = new Double(method.invoke(obj)); 
} 

Aber Eklipse sagt mir, hier bin mit, dass er will, dass ich die Ausgabe von invoke zu einem Double Fall. Im Grunde will es mir dies ... mir

if (numberTypes.contains(method.getReturnType().getSimpleName())){ 
    Double a = new Double((Double) method.invoke(obj)); 
} 

Aber das scheint zu tun, wie ich da einen Fehler eingeführt werden könnte, wenn das Objekt tatsächlich eine primitive int (zum Beispiel), dann scheint es mir, wie die Besetzung wäre falsch. Also die offenen Fragen:

1) Sollte ich einfach den Cast einfügen?

2) Gibt es eine bessere Möglichkeit, den Rückgabewert in ein Double zu konvertieren?

3) Wenn das ultimative Ziel darin besteht, das Double in einen String zu konvertieren, gibt es eine Abkürzung, die ich hier nehmen kann? Zum Beispiel könnte es sich herausstellen, dass wir letztlich nur den Wert als String über das Netzwerk senden müssen. Gibt es einen besseren Weg, das Obige zu erreichen, wenn das das ultimative Ziel ist?

Antwort

1

1). Java verwendet den Kompilierungs-Polymorphismus für das Überladen - welche überladene Methode wird während des Kompilierens bestimmt.

Zum Beispiel:

static double f(Integer x) { ... } 
static double f(Double x) { ... } 

// somewhere in the code: 
Object h = new Double(14.0); 
f(h); // won't compile - unable to determine which method you want to invoke 
f((Integer)h); // will compile, but fail at run-time with ClassCastException 
f((Double)h); // will compile and succeed. 

, deshalb, Eklipse Sie erzählt eine Besetzung durchzuführen - es muss die genaue Konstruktor wissen aufzurufen (Double hat zwei Konstruktoren - man akzeptiert String, eine andere - double).

Jetzt denke ich sollte klar sein, dass Sie nicht einfach auf Double (wie Sie Wert von anderem Typ haben können), so sollten Sie nicht nur die Besetzung einfügen.

2). Reflexion automatically boxes primitives for you. So gibt es einen besseren Weg, dies zu erreichen:

double a = ((Number)method.invoke(obj)).doubleValue(); 

3). In Anbetracht dessen, dass Sie höchstwahrscheinlich Ihren Wert irgendwie formatieren wollen, sollten Sie keine Abkürzungen verwenden.

Verwandte Themen