簡體   English   中英

Java反射。 將返回值轉換為雙精度

[英]Java reflection. Convert returned value to double

我想使用Java反射將方法的返回值轉換為double,而不管實際的返回類型是Number還是原始的int,long,float,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在這里告訴我,它希望我將invoke的輸出轉換為Double 從本質上講,它希望我這樣做...

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

但這在我看來,我可能會引入一個錯誤,因為如果該對象實際上是一個原始int(例如),那么在我看來,強制轉換將是不正確的。 所以公開的問題:

1)我應該只插入演員表嗎?

2)是否有更好的方法將返回值轉換為Double?

3)如果最終目標是將Double轉換為String,那么我可以在這里使用快捷方式嗎? 例如,事實證明,我們最終只需要通過網絡將值作為String發送。 如果那是最終目標,是否有更好的方法來實現上述目標?

1)。 Java使用編譯時多態性進行重載-要運行的重載方法是在編譯期間確定的。

例如:

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.

這就是Eclipse告訴您執行強制轉換的原因-它需要知道要調用的確切構造函數( Double有兩個構造函數-一個接受String ,另一個接受double - double )。

現在,我認為應該很清楚,您不能簡單地將其強制轉換為Double (因為您可能具有其他類型的值),因此您不應該只是插入強制轉換。

2)。 反射會自動為您裝箱原語 因此,有一種更好的方法可以完成此操作:

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

3)。 考慮到您很可能希望以某種方式格式化您的價值,我認為您不應采取任何捷徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM