2012-04-27 19 views
5

次のようなコンストラクタが必要です。Java:java.lang.Numberのサブクラスである同じ型の2つの値を追加します。

ここでは、nにvalueを追加するincrementValue(Number n)というメソッドがあります。私はあなたがキャストの可能性のある問題のために2つのNumberオブジェクトを一緒に追加できないことを知っています。ただし、値を保証するために小切手を使用し、nが同じタイプの場合は、これらを一緒に追加することは可能ですか?あるいは、これについてもっと良い方法があります。

今はIntegerとDoubleのインスタンス変数を宣言し、その値を正しい型に割り当てます。私はこれを拡大してNumberの任意のサブクラスを許可することを考えていました。明らかに私はそれぞれのために別々のメソッドを書くことができますが、それは悪いプログラミングのように思えます。

これはjavaでも可能ですか?これについて完全に間違っていますか?

+0

抽象スーパークラス「番号」を使用する理由あなたは階層構造の下で具体的なサブクラスを使用していますか? – Perception

+0

@Perceptionこれは、練習/楽しみのためのものであり、後でそれを拡張したいので、可能な限り多くの可能な型を許可したいと思っていました。 – thealfreds

答えて

5

あなたは可能性がありconvert all Numbers to a single typedoubleが最小非可逆です):

class Attribute { 

    private double value; 

    public Attribute(String attrName, Number attrValue) { 
     this.name = attrName; 
     this.value = attrValue.doubleValue(); 
    } 

} 

しかし、IMOあなただけのコンストラクタをオーバーロードする方がいいでしょう。 Numberは、実際には私の経験(そしてI don't seem to be the only one who thinks so)の中で非常に有用なクラスではありません。

class Attribute { 

    public Attribute(String attrName, int attrValue) { 
     this.name = attrName; 
     this.value = attrValue; 
    } 

    public Attribute(String attrName, double attrValue) { 
     this.name = attrName; 
     this.value = attrValue; 
    } 
} 
+0

これはまさに私が今持っているものです。私はBigInteger、BigDecimal、Byteなどを許可することを望んでいました。各コードに対してincrementValue()メソッドを作成した後、多くのコピー貼り付けが行われます。 – thealfreds

+0

実際にそれについて考えると、他のタイプを含めるのがよい理由はありますか?私はこれがデータベースに格納される可能性があり、すべてのタイプを許可する必要があると思っていました。 – thealfreds

+2

BigIntegerとBigDoubleを追加するには、[インスタンスメソッド](http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#add(java。 math.BigInteger))。 **あなたは '+'を使うことはできません。**私はあなたのデザインを考え直し、本当に可能な数値タイプをすべてサポートする必要があるかどうかを考えます。 –

0

いいえ、Javaでは使用できません。あなたが知ることができるのは、あなたが知っているNumberのすべてのケースを調べることです。

私は確かにNumberサブクラスを書くことができませんでしたが、それはやや無意味な実装です。

関連する問題