[英]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.