0

我正在尝试创建一个在 java 中添加任何数字类型列表的通用方法。我希望能够使用这种方法来添加整数、双精度数、长整数等。下面似乎不起作用。我在 Eclipse 中得到编译异常说: The operator + is undefined for the argument type(s) Number, T 可能是什么问题?先感谢您。

public static <T extends Number> T sum(ArrayList<T> nums){
    Number retVal = 0.0;
    for (T val : nums){
        retVal = retVal+ val;
    }
    return (T) retVal;
}
4

3 回答 3

0

考虑一下你的要求。您需要一个集合,您可以在其中放置任意类型的数量,并执行诸如sum(). 有八种不同的数字子类型(BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short,不包括原子版本)。

您会注意到java.lang.Number没有算术方法,例如add()or multiply()。您不能随便添加Number子类的实例;您必须考虑每个可能的配对,决定将一个或两个转换为定义加法的通用类型的规则,然后决定结果类型是什么。

然后,这必须应用于您添加到运行总数中的每个数字。这是一项不平凡的设计任务。

幸运的是,您可以捎带 JLS 中已经存在的基本类型的设计决策,但这仍然需要大量工作。

于 2013-10-16T04:18:23.113 回答
0

代替 retVal = retVal+ val;

像下面这样使用。

retVal = retVal.doubleValue()+ val.doubleValue();
于 2013-10-16T02:33:37.723 回答
0

考虑一下 Java 语言规范对加法+运算符的描述

如果 + 运算符的任一操作数的类型是字符串,则该操作是字符串连接。

否则,+ 运算符的每个操作数的类型必须是可转换(第 5.1.8 节)为基本数字类型的类型,否则会发生编译时错误。

Number不是可转换为原始类型的类型。因此,您不能将+运算符与该类型的变量一起使用。

考虑为每种数字类型使用不同的类型或重载方法。

于 2013-10-16T02:45:08.463 回答