我正在尝试创建一个泛型方法,在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;
}
答案 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中原始类型已经存在的设计决策,但它仍然需要做很多工作。