Java 推广一种方法

Java 推广一种方法,java,generics,java-8,java-stream,Java,Generics,Java 8,Java Stream,我有这个方法 public static Integer addCollectionElements(List<Integer> list) { return list.stream().reduce(0, Integer::sum).intValue(); } 公共静态整数addCollectionElements(列表){ return list.stream().reduce(0,Integer::sum).intValue(); } 我想将其推广到实现sum方

我有这个方法

public static Integer addCollectionElements(List<Integer> list) {
    return list.stream().reduce(0, Integer::sum).intValue();
} 
公共静态整数addCollectionElements(列表){
return list.stream().reduce(0,Integer::sum).intValue();
} 
我想将其推广到实现sum方法的任何类(例如Float)

是否可以通过使用Java泛型来实现这一点

Integer.sum()
只是一个静态方法,可以用作
二进制运算符。没有办法使其成为“具有方法
sum
的对象的通用方法”。 您可以做的是在该方法中添加两个以上的参数,在这里您可以提供自己的
sum
函数和一个初始值-在您的示例中为零。一个极端的例子是:

public static <T extends Number> T addCollectionElements(List<T> list, T initialValue, BinaryOperator<T> sumFunction){
    return list.stream().reduce(initialValue, sumFunction);
}
但我不相信这样做会带来任何好处。

不幸的是,基类没有
sum
方法,所以不能直接这样做。但是,您可以对收到的每个
号码调用
doubleValue()
,并将它们相加为双倍:

public static double addCollectionElements(List<? extends Number> list){
    return list.stream().mapToDouble(Number::doubleValue).sum();
}

公共静态双addCollectionElements(ListNo,不是。对不起。@khelwood这是一个静态方法,所以超类是不相关的。@shmosel很好的观点。为什么不使用
Double::sum
?@shmosel很好的观点,谢谢-我会编辑它。肯定比自己用
a+b
重新实现它更优雅。这通常是可行的,但如果你想在co中使用它,请小心。)ntext,您可以在其中处理
列表
。如果在double中存储大于+/-2^52的数字,您将开始失去精度,long可以存储高达+/-2^63的数字。您甚至不需要double::sum或reduce方法。DoubleStream有自己的方法。您甚至可以执行
收集
public static double addCollectionElements(List<? extends Number> list){
    return list.stream().mapToDouble(Number::doubleValue).sum();
}