2011-12-29 17 views
2

私はJava Generics and adding numbers togetherのような質問を頻繁に見てきました。答えは通常Numberで何もできません。Numberクラスの目的は何ですか?

Sourcecodeは、例題のオブジェクトとは異なり、Numberがほとんど空のシェルであることを示しています。

この時点で私の代わりに、具体的なサブタイプのNumberを使用すると、重要な(もしあれば)の利点を持っている状況を考えることはできません。通常はNumberで始まりますが、後で実際にそれを使用して問題に遭遇し、とにかくサブタイプに変更します。しかし、これは私の限られた経験であるかもしれません。

このクラスの目的は、実際の機能を持たない他の数値型の共通の祖先ではないのですか?

答えて

3

As you can see in the Javadocs,抽象クラスです。定義によると、その唯一の目的は、他の数値型の基本クラスとして機能することです。すべてのNumberサブクラスがあります、もう1つは、私はそれはそれについてだと思う

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

のようなものを書いて想像することができるメソッドのセット(例えば、intValue())があります。それ以外に何を期待しますか?

0

すべてのJavaの数値型は、数値を拡張し、番号が他のすべての数値形式に変換する方法を提供するので、Javaプログラマは、常に安全に別の数値型から変換できることを確認することができます。これは非常に便利なプロパティです。

+0

安全にですか? ;-)それについては分かりません。 –

+0

さて、可能な限り安全に...少なくともあなたは例外をスローしません!もちろん、範囲を確認せずに不用意に変換しようとすると、切り捨てや丸めが問題になるかどうかを検討すると、間違いなく問題になります。 – Renato

+2

実際に安全にしたい場合は、値をBigDecimalとして保存し、さまざまな正確なメソッド(BigDecimal#longValueExactなど)を使用します。目的のプリミティブのサイズが適切に値を格納できない場合、例外がスローされます。 – Saish

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. より小さい値を格納しながら、より正確な形式(longまたはdouble)を使用するようにクライアントコードを書き込むことができます。
  3. あまりにも具体的でない数値(Long)またはあまりにも抽象的な(Object)という数字を中間コードに渡すことを許可します。
  4. 並べ替えを使用すると、固定精度(Integer)から無限精度(BigInteger)にスケールすることができますが、これを行うには、算術演算を基本クラスに追加する必要があります。
  5. クライアントコードが可変性に注意を払わずに値を消費できるようにします()、ただし、オブジェクトへの参照は格納されません。
  6. 数字の表現の代替実装を許可します。たとえば、自分自身でFractionと書くと、doubleと表すことができます。
  7. カーソルスタイルのAPIを使用できます(例:IntegerCursor)。しかし、このテクニックを使用するときは、クライアントコードがその番号への参照を格納しないようにする必要があることに注意してください。
関連する問題