我正在尋找一種簡單,簡潔的方式將給定的Number對象轉換爲給定數字類型的對象。在Java中的數字對象之間的轉換
- 由於收縮轉換損失的精度是好的
- 我不想去通過字符串。
我需要這樣的東西:
private static Number convert(Number num, Class<? extends Number> targetType)
有沒有辦法做到這一點不檢查的所有類型的組合?
我正在尋找一種簡單,簡潔的方式將給定的Number對象轉換爲給定數字類型的對象。在Java中的數字對象之間的轉換
我需要這樣的東西:
private static Number convert(Number num, Class<? extends Number> targetType)
有沒有辦法做到這一點不檢查的所有類型的組合?
我覺得最明顯的方法是使用蠻力:
private static Number convert(Number num, Class<? extends Number> targetType) {
Number result = null;
if (Byte.class.equals(targetType)) {
result = Byte.valueOf(num.byteValue());
} else if (Short.class.equals(targetType)) {
result = Short.valueOf(num.shortValue());
} else if (...) {
...
} else {
throw new IllegalArgumentException("targetType is not a Number");
}
return result;
}
你可以使用反射,但我發現更多的hackish。
+1以避免反思。反思會減慢應用程序的速度......我會這樣做。 – 2010-09-19 18:09:14
不錯。我將使用這個解決方案。通過這些類型的靜態方法,不需要實際檢查所有類型的組合。謝謝! – 2010-09-19 19:26:11
這很好用。我建議處理num == null。 – Bampfer 2015-01-08 17:46:44
也許轉換通過BigDecimal
會工作?
我懷疑這需要轉換爲字符串或使用反射,對不對? – 2010-09-19 16:28:27
您可以使用類似:
String simpleName = targetType.getSimpleName().toLowerCase();
if (simpleName.equals("integer")) {
simpleName = "int";
}
Method m = number.getClass().getMethod(simpleName + "Value");
return (Number) m.invoke(number);
這依賴於一個事實,即Number
有一個像longValue()
,floatValue()
方法等
至於BigInteger
或AtomicInteger
- 你可以沉思使用其構造函數,它接受一個參數 - 原始類型。
+1。需要檢查'AtomicInteger','AtomicLong','BigDecimal','BigInteger'類型沒有作爲targetType傳入,因爲它們在Number中沒有xxxValue()方法。 – 2010-09-19 16:17:40
@Noel M:我不需要處理這些類型。但是,現在我意識到性能很重要。我可能會考慮詳細的解決方案,而不是......無論如何,我喜歡這個解決方案的創造力:) – 2010-09-19 16:23:00
無論實現如何,我至少會將方法簽名重寫爲'public static N convert(Number number,Class type)''。這將返回完全指定的數字類型,這在後期處理中可能具有優勢。 –
BalusC
2010-09-19 18:04:29
@BalusC:你說得對。謝謝! – 2010-09-19 19:21:53