首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java泛型的两个集合之间的逐个算术元素的差异

使用Java泛型的两个集合之间的逐个算术元素的差异
EN

Stack Overflow用户
提问于 2013-01-11 18:56:32
回答 3查看 259关注 0票数 0

假设我们有两个有序的数字集合。我们想要逐个元素地计算算术差。我认为我们需要使用数字列表来对“数字有序集合”的概念进行建模。问题是没有为数字定义算术差(如3-2中的平凡的'-‘)。我可以将所有东西都转换为双倍,但我更喜欢干净的解决方案。

代码语言:javascript
复制
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;
}

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-11 19:01:04

因为Number不提供任何subtract方法,所以您不能简单地这样做。我能想到的替代方案是:

  1. 使用提供的doubleValue()方法,并返回一个double,但如果列表包含BigDecimal,则可能会丢失精度。
  2. 为每个可用的Number子类提供一个方法,但它可能会创建大量重复的将类型转换为任何有意义的内容(如果精度不太重要,则为double;如果有意义,则为BigDecimal ),这是(2)的子例。

选项2可以通过用difference.add(subtract(currMinuend, subtrahend.get(i)));替换difference.add(currMinuend-subtrahend.get(i));来实现

然后只需编写10个subtract方法就可以了:

代码语言:javascript
复制
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); }

等。

票数 5
EN

Stack Overflow用户

发布于 2013-01-11 19:03:47

这与泛型、数组等无关。Java不允许操作符重载,因此您不能用-减去2个数字,而且Number类没有为数值操作定义任何方法。它不能,因为它可能在不同的子类上操作(例如Integer.subtract(Double)),这将使定义返回类型变得不可能。

我认为这里需要使用内部类型或BigDecimal (或类似的)。

票数 1
EN

Stack Overflow用户

发布于 2013-01-11 19:13:35

如果您想要处理许多算术类型,可以将列表设置为泛型列表,然后在想要找出它们之间差异时添加处理程序。处理程序检查类型是Double、Integer的实例,还是您想要的任何类型。根据每种类型,您可以计算差值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14276656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档