2010-09-19 23 views
2

我正在尋找一種簡單,簡潔的方式將給定的Number對象轉換爲給定數字類型的對象。在Java中的數字對象之間的轉換

  • 由於收縮轉換損失的精度是好的
  • 我不想去通過字符串。

我需要這樣的東西:

private static Number convert(Number num, Class<? extends Number> targetType) 

有沒有辦法做到這一點不檢查的所有類型的組合?

+1

無論實現如何,我至少會將方法簽名重寫爲'public static N convert(Number number,Class type)''。這將返回完全指定的數字類型,這在後期處理中可能具有優勢。 – BalusC 2010-09-19 18:04:29

+0

@BalusC:你說得對。謝謝! – 2010-09-19 19:21:53

回答

4

我覺得最明顯的方法是使用蠻力:

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。

+0

+1以避免反思。反思會減慢應用程序的速度......我會這樣做。 – 2010-09-19 18:09:14

+0

不錯。我將使用這個解決方案。通過這些類型的靜態方法,不需要實際檢查所有類型的組合。謝謝! – 2010-09-19 19:26:11

+0

這很好用。我建議處理num == null。 – Bampfer 2015-01-08 17:46:44

1

也許轉換通過BigDecimal會工作?

+0

我懷疑這需要轉換爲字符串或使用反射,對不對? – 2010-09-19 16:28:27

4

您可以使用類似:

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()方法等

至於BigIntegerAtomicInteger - 你可以沉思使用其構造函數,它接受一個參數 - 原始類型。

+0

+1。需要檢查'AtomicInteger','AtomicLong','BigDecimal','BigInteger'類型沒有作爲targetType傳入,因爲它們在Number中沒有xxxValue()方法。 – 2010-09-19 16:17:40

+0

@Noel M:我不需要處理這些類型。但是,現在我意識到性能很重要。我可能會考慮詳細的解決方案,而不是......無論如何,我喜歡這個解決方案的創造力:) – 2010-09-19 16:23:00

相關問題