2017-02-13 8 views
0

Java Reflectionを使用して、実際の戻り値の型がNumberか、long、float、doubleなどのいずれであるかにかかわらず、メソッドの戻り値をdoubleに変換したい。Javaのリフレクション。返された値をdoubleに変換する

方法は、実際に私は、二重に変換できる値を返していることを確認するために、私は

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)); 
} 

を使用しています。しかしEclipseは、それはDoubleinvokeの出力をケースに私を望んでいることを、ここで私に語りました。基本的にそれは

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

...私はこれをしたいしかし、オブジェクトが実際に(例えば)プリミティブint型であれば、それは次のように私には思えるので、私はエラーを導入することができように、それは私には思えますキャストは間違っています。オープン質問:

1)キャストを挿入するだけですか?

2)戻り値をDoubleに変換するより良い方法はありますか?

3)究極の目的は、Doubleを文字列に変換することです。私はここで取ることができるショートカットはありますか?たとえば、最終的に値をネットワーク経由でStringとして送信する必要があることが判明する可能性があります。それが究極の目標である場合、上記を達成するためのより良い方法はありますか?

答えて

1

1)。 Javaは、オーバーロードのためにコンパイル時のポリモーフィズムを使用します。このオーバーロードされたメソッドは、コンパイル時に決定されます。例えば

:Eclipseはキャストを実行するためにあなたを伝える理由です

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. 

- それは呼び出すために正確などのコンストラクタ知っている必要があります(Doubleは、2つのコンストラクタを持っている - 1はStringを受け入れ、別の1 - double)。

Doubleにキャストできないことは明らかです(他のタイプの価値があるかもしれないので)。キャストを挿入するだけではありません。

2)。反射automatically boxes primitives for you。したがって、これを達成するためのより良い方法があります:

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

3)。あなたが何らかの形であなたの価値をフォーマットしたいと思っていることを考えれば、あなたはどんなショートカットも取るべきではないと思います。

関連する問題