通用方法不在java中添加任意数字类型

时间:2013-10-16 02:28:05

标签: java generics generic-collections

我正在尝试创建一个泛型方法,在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;
}

3 个答案:

答案 0 :(得分:0)

而不是retVal = retVal+ val;

使用如下。

retVal = retVal.doubleValue()+ val.doubleValue();

答案 1 :(得分:0)

考虑Java语言规范关于添加剂+运算符

的内容
  

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

     

否则,+运算符的每个操作数的类型必须是   可转换(第5.1.8节)到原始数字类型的类型,或者   发生编译时错误。

Number不是可转换为基元的类型。因此,您不能将+运算符用于该类型的变量。

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

答案 2 :(得分:0)

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

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

然后必须对添加到运行总计的每个数字应用此项。这是一项非常重要的设计任务。

幸运的是,您可以捎带JLS中原始类型已经存在的设计决策,但它仍然需要做很多工作。