2011-12-29 82 views
2

我經常看到類似Java Generics and adding numbers together這樣的問題,答案通常歸結爲您無法真正對Number本身做任何事情。Number類的用途是什麼?

Sourcecode表明Number大多不像示例對象的空殼。

在這一點上,其中使用Number而不是一個具體亞型我想不出的情況有顯著(如果有的話)的優勢。通常我會從Number開始,但在實際使用它時會遇到問題,並將其更改爲子類型。但這可能只是我有限的經驗。

所以我想知道,這是什麼類的其他然後是數字類型的,沒有實際功能的共同祖先的目的是什麼?

回答

3

As you can see in the Javadocs,這是一個抽象類。按照定義,那麼它的唯一目的是作爲其他數字類型的基類。有一組的每一個該子類Number都會有方法(例如,intValue()),以及一個能想象寫東西像

if (object instanceof Number) 
    result = ((Number) object).intValue(); 
else if (object instanceof String) 
    result = Integer.parseInt(object.toString()); 

我想這就是它。你還會期待什麼?

0

因爲所有Java數字類型擴展號碼,並提供數轉換方法的所有其他數字格式,Java程序員可以始終確保可以安全地從一個數字類型轉換爲另一種。這是一個非常有用的屬性。

+0

安全嗎? ;-)不確定。 – 2011-12-29 18:40:01

+0

那麼,儘可能安全......至少你不會拋出異常!但是,當然,如果您嘗試在不檢查範圍的情況下不小心轉換,或者考慮截斷和舍入是否會成爲問題,那麼您肯定會遇到麻煩。 – Renato 2011-12-29 19:03:18

+2

如果您確實想要安全地執行此操作,請將該值存儲爲BigDecimal,然後使用各種確切的方法(例如BigDecimal#longValueExact)。如果所需基元的大小無法正確存儲值,則會引發異常。 – Saish 2011-12-29 22:51:07

0

一個抽象類由表示數值基本類型的所有類擴展諸如ByteShortIntegerLongFloat,和Double。該類包含將對象值轉換爲任何其他數字類型的抽象方法。所有這些方法都被數字子類覆蓋。它還包含將數字類型轉換爲字符串的方法,反之亦然。 See

public abstract class java.lang.Number extends java.lang.Object implements java.io.Serializable 
{ 
    //...... 
} 

See a long example that uses the Number class

0

嗯,我希望它至少實現可比但我怎麼看Integer.compareTo(SomeNumberType)可能無法與SomeNumberType.compareTo(整數)同意;這就是爲什麼只有子類實現Comparable。

1

它允許進行以下:

  1. 從一種類型的執行(可能有損)轉換成另一種。
  2. 允許客戶機代碼被寫入到使用更精確的形式(longdouble),同時存儲所述較小的值。
  3. 允許中間代碼傳遞數字而不是太具體(Long)或太抽象(Object)。
  4. 排序允許代碼從固定精度(Integer)到無限精度(BigInteger)規模......但這樣做的權利,他們應該添加的算術運算的基類。
  5. 允許客戶端代碼消耗值而不必關注可變性(LongAtomicLong),前提是它不存儲對象的引用。
  6. 允許用於表示數字的替代實現,例如編寫自己的Fraction,可以表示爲double
  7. 允許使用遊標式API,例如IntegerCursor。但請記住,使用這種技術時,您需要確保客戶端代碼不會存儲對該號碼的引用。