我想制作一个通用方法,它可以得到List
个数字的总和。
我正在尝试的是:
public static <T extends Number> T sumList(List<T> data)
{
T total = 0;
for (T elem : data)
{
total += elem;
}
return total;
}
但问题是there is no += operator in T
和total can't be assigned to zero
。
我该怎么做?
由于
答案 0 :(得分:18)
有些方法你可以一起破解这个,但老实说,仿制药根本就不是去这里的方法。为每个具体的原始包装类型构建一个方法并分别实现它们。使它成为通用的将是一件令人头疼的问题;算术运算一般不会发生。
你也没有真正获得任何东西。它是如此简单和常量的代码,您不必担心代码重复,因为它不会改变。人们不会将自己的数字类型传递给您的代码;它适用的类型域已经很好地定义和有限。
答案 1 :(得分:4)
我最近已经完成了(基于lambdaj代码),请注意它需要所有元素都是相同的类型(你不能真正添加Byte
和{{1}如果不是这样,可以抛出一个CCE,并且不会处理自定义BigDecimal
:
Number
答案 2 :(得分:0)
您可以使用库,例如Generic Java Math(其编号部分),它为Number子类提供通用操作。它提供了一种通常使用数字的方法,就像在您的示例中一样,但是通过传递Arithmetics对象,可以进行实际计算。请参阅主页上的示例 它必须使用盒装类型,因此如果您需要速度,在Java中没有通用实现可以做到这一点,您必须使用原始类型。
答案 3 :(得分:0)
看看下面的通用方法示例,用于任何Number类型的变量列表的求和... 我相信这就是你要求的......
马克·彼得斯的答案也是正确的,但这也是一个可行的解决方案。
public class GenericSum {
@SuppressWarnings("unchecked")
public static <E> E sumArray(E[] inputArray) {
Double result = 0.0;
// Sum array elements
for (E element : inputArray) {
result = ((Number) result).doubleValue()
+ ((Number) element).doubleValue();
}
return ((E) result);
}
public static void main(String args[]) {
// Create arrays of Integer, Double
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
System.out.println("Sum of doubles : " + sumArray(intArray));
System.out.println("Sum of doubles : " + sumArray(doubleArray));
}
}