0

假设我们有 2 个有序的数字集合。我们要逐个元素地计算算术差异。我认为我们需要使用数字列表来模拟“有序数字集合”的概念。问题是没有为 Number 定义算术差异(如 3-2 中的平庸的“-”)。我可以将所有内容都转换为 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()方法,并返回 a double,但如果列表包含 BigDecimal 例如,您可能会丢失精度。
  2. 每个可用Number的子类都有一个方法,但它可能会创建很多重复的代码......
  3. 将类型限制为任何有意义的类型(如果精度无关紧要则说 double 或 BigDecimal 如果确实如此),这是 (2) 的子情况。

选项 2 可以通过替换来difference.add(currMinuend-subtrahend.get(i));实现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 回答