0

2つの注文された番号のコレクションを取得したとします。要素ごとに算術差を計算したいと思います。「番号の順序付けられたコレクション」の概念をモデル化するには、番号のリストを使用する必要があると思います。問題は、算術の差(3-2のような平凡な'-')がNumberに対して定義されていないことです。すべてをDoubleにキャストできますが、クリーンなソリューションを好みます。

public static <E extends Number> List<E> listDifferenceElementByElement(List<E> minuend, List<E> subtrahend) throws Exception {
    if (minuend.size() != subtrahend.size()) {
        throw new Exception("Collections must have the same size"); //TODO: better exception handling
    }
    List<E> difference = new ArrayList<E>();
    int i = 0;
    for (E currMinuend : minuend) {
        difference.add(currMinuend-subtrahend.get(i)); //error: The operator - is undefined for the argument type(s) E, E
        i++;
    }
    return difference;
}

何か案が?

4

3 に答える 3

5

Number方法がないのでsubtract、簡単に行うことはできません。私が考えることができる選択肢は次のとおりです。

  1. 提供されているdoubleValue()メソッドを使用して、を返しdoubleますが、たとえばリストにBigDecimalが含まれていると、精度が低下する可能性があります。
  2. Number使用可能なサブクラスごとに1つのメソッドがありますが、重複したコードが多数作成される可能性があります...
  3. タイプを意味のあるものに制限します(精度があまり重要でない場合はdouble、重要な場合はBigDecimalなど)。これは(2)のサブケースです。

difference.add(currMinuend-subtrahend.get(i));オプション2は、次のように置き換えることで実装できます。difference.add(subtract(currMinuend, subtrahend.get(i)));

次に、10個のsubtractメソッドを作成するだけです。

private static int subtract(int a, int b) { return a - b; }
private static double subtract(double a, double b) { return a - b; }
private static BigDecimal subtract(BigDecimal a, BigDecimal b) { return a.subtract(b); }

于 2013-01-11T11:01:04.390 に答える
1

これはジェネリックスや配列などとは関係ありません。Javaでは演算子のオーバーロードが許可されていないため、で2つの数値を減算することはできず-Numberクラスは数値演算のメソッドを定義しません。異なるサブクラス(例:Integer.subtract(Double))で動作している可能性があるため、これはできません。これにより、戻り型の定義が不可能になります。

ここでは、組み込み型または(または同様の)ものを使用する必要があるBigDecimalと思います。

于 2013-01-11T11:03:47.420 に答える
0

多くの算術型を処理する場合は、リストをジェネリックリストとして設定し、それらの違いを見つけたいときにハンドラーを追加できます。ハンドラーは、タイプがDouble、Integer、または必要なもののインスタンスであるかどうかを確認します。各タイプに基づいて、差を計算できます。

于 2013-01-11T11:13:34.610 に答える