1

java.lang.Numberを多態的に使用しようとしています。複数のDouble、Integerなどのインスタンスを配置するリストがあり、それらに対して多態的に算術演算を実行したいと思います(たとえば、Numberごとにdouble)。

java.lang.Numberを使用した自動ボクシング機能はありません。また、サンプルソースコードに-それほどポリモーフィックではない-メソッドmultiply(Number n、int factor)を使用せずに、これを行うためのより良い方法を見つけていません。次のようになります...そしてこの実装では、各算術演算(加算、減算など)のメソッドが必要になります。


編集-質問の強化:抽象化の観点からjava.lang.Numberを考えると、任意の数値を算術演算の一部にできると思いますが、それでも、加算/減算/する簡単な方法は存在しないようです。タイプ(Integer、Double、Short ...)に関係なく、multiply /etcxを数値のリストに追加します。


より良いアイデアはありますか?前もって感謝します ;)

サンプルソースコード:

public class NumberTest {

    private List<Number> list = new ArrayList<Number>();    

    public static void main(String args[]) {
        new NumberTest().start();

    }

    protected void start() {
        this.fillList();
        Number num;
        for (int i = 0; i < list.size(); i++) {
            num = this.multiply(list.get(i), 2);
            list.set(i, num);
        }

        System.out.println(this.toString());
    }

    private void fillList() {
        list.add(new Byte((byte) 12));
        list.add(new Short((short) 20));
        list.add(new Integer(30));
        list.add(new Long(40));
        list.add(new Float(50.123));
        list.add(new Double(60.123));
    }

    private Number multiply(Number n, int factor) {
        if (n instanceof Byte) {
            n = n.byteValue() * factor;
        } else if (n instanceof Short) {
            n = n.shortValue() * factor;
        } else if (n instanceof Integer) {
            n = n.intValue() * factor;
        } else if (n instanceof Long) {
            n = n.longValue() * factor;
        } else if (n instanceof Float) {
            n = n.floatValue() * factor;
        } else if (n instanceof Double) {
            n = n.doubleValue() * factor;
        }
        return n;
    }

    @Override
    public String toString() {
        String result = "";
        for (Number num : list) {
            result += num+"\n";
        }
        return result;
    }
4

3 に答える 3

1

Number.doubleValue() を使用して計算できない理由が本当にわかりません。私は何が欠けていますか?

例えば

public Double multiply(Number n, double factor) {
   return new Double(n.getDoubleValue() * factor);
}

追加された編集:

@amano は、元のタイプを維持したまま、既存の List 内の Objects を変更したいことを明らかにしました。私の最初の質問は「なぜ」だと思いますか?彼の例ではByte. ほとんどの場合、Byte を乗算すると、オーバーフローが発生することがよくあります。doubleaを anに追加すると、Integer精度が失われます。integera から aを引き、Byte結果を a に強制的に戻すByte通常、間違った結果が得られます。整数を整数で割ると、通常は精度が失われます (たとえば、1.5 ではなく 3/2 = 1)。絶対的な完全な精度が必要でない限り (たとえば、お金のために)、最も数学的に正しい解決策は、常に double に変換し、結果を double として保持することです。はい、小さな丸め誤差がありますが、3/2 = 1 や (バイト)23 - 665544 = バイトとは何かわかりません。

そして、値がもともと Byte だったことをどうして気にするのでしょうか? 数字として扱いたいと大騒ぎするときは?ナンバーズ イン、ナンバーズ (技術的にはダブルス) アウト。

だから私はよく理解していますが、まだ何かが欠けています。値が同じ元の型のままであるという制約により、不正確さが生じ、さらに多くの作業が必要になります。 その制約を主張する場合、はい、多くのことを行う必要がありinstanceofます。

于 2012-08-17T02:39:02.793 に答える
0

Number クラス階層をミラーリングします。独自の NumberWrapper クラスを作成し、プリミティブごとに、実際の型を認識して適切な操作を実行できる特殊なクラスを作成します。

深夜の編集: もちろん、いつでも Number#doubleValue() を使用して、double のみで処理を行うことができます...

于 2012-08-17T01:33:55.487 に答える
0

私はタソスに同意しますが、それをすべて書くのは非常に退屈に思えます...

車輪を再発明する代わりに、 http://code.google.com/p/generic-java-math/のようなものを使用してみてください。私はこのライブラリを自分で使用したことはありませんが、必要なもののようです。

于 2012-08-17T02:05:46.840 に答える