在java中不添加任意数字类型的泛型方法

在java中不添加任意数字类型的泛型方法,java,generics,generic-collections,Java,Generics,Generic Collections,我试图创建一个通用方法,在java中添加任何数字类型列表。我希望能够使用此方法来添加整数、double、long等。。 下面的方法似乎不起作用。我在eclipse中看到编译异常,它说: 未为参数类型编号T定义运算符+ 有什么问题吗?先谢谢你 public static <T extends Number> T sum(ArrayList<T> nums){ Number retVal = 0.0; for (T val : nums){ r

我试图创建一个通用方法,在java中添加任何数字类型列表。我希望能够使用此方法来添加整数、double、long等。。 下面的方法似乎不起作用。我在eclipse中看到编译异常,它说:
未为参数类型编号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;
}
publicstatict和(arraylistnums){
数字retVal=0.0;
对于(T val:nums){
retVal=retVal+val;
}
返回(T)返回;
}

而不是
retVal=retVal+val

像下面这样使用

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

考虑Java语言规范对加法
+
运算符的说明

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

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

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


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

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

您会注意到,
java.lang.Number
没有算术方法,比如
add()
multiply()
。你不能随意地把
Number
子类的实例加起来;必须考虑每一个可能的配对,决定将一个或两个转换为一个共同类型的规则,为其定义加法,然后决定结果类型是什么。 然后,这必须应用于您添加到运行总数中的每个数字。这是一项非常重要的设计任务


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

对于错误,您不了解什么?为什么?它为什么这样做?这是一个数字,我应该可以加上它。如果我创建了一个
imaginarynumberextensednumber
,那么
+
操作符的结果会是什么呢?Java不能向未知类添加数字,您定义了
ArrayList
将其定义为
ArrayList
Sotirios,很好。谢谢。但这只是假设数值是双倍的。我的数值可以是任何东西。双精度、整数、长型等。谢谢。我不想让我的方法过载。另一种选择是什么?仅有的两种可能是按照Prabhakaran在回答中提出的方法(但你必须决定类型)和使用重载方法。我在考虑使用instanceof在添加之前进行类型检查,然后返回适当的数字subtype@ImtiazAhmad我想那很好,但是你真的有这样一种情况吗?你声明了一个
列表
并放置了各种类型?@Imtiaz Ahmad:你不能这样做,因为调用方可以将
Number
的任何子类传递给你的方法,包括你不知道的类。此外,传递的列表可以直接用抽象的
Number
类而不是具体的子类参数化。这样的列表可以包含任意混合的
Number
类型,因此在这种情况下没有“适当的
Number
子类型”<代码>列表l=Arrays.asList(新的双十进制(4),42.0,(字节)1,新的原子整数(300));数字n=你的类。排序(l)