我有以下情况:
class MyListOfNumbers<T extends Number & Comparable<T>>
{
public T sum()
{
return list_of_Ts.stream()
.sum();
}
}
我对T一无所知(故意)除了它是一个数字,它可以与“兄弟姐妹”进行比较(需要对东西进行排序......)。
显然这不起作用,它不会以旧的Java方式(即循环)工作,因为据我所知,你根本不能做T x = 0
。
这不会起作用,我认为同样的原因和 T 没有实现 sum 的事实;而且我读过它对空集无效。
class MyListOfNumbers<T extends Number & Comparable<T>>
{
public T sum()
{
return list_of_Ts.stream()
.reduce(0, T::sum);
}
}
然后该怎么做?
编辑:请考虑T可以是从字节到BigDecimal的任何内容,并强制它为整数可能意味着丢失数据
答案 0 :(得分:3)
将累加器函数和标识值作为参数传递:
public T sum(T identity, BinaryOperator<T> accumulator) {
return list_of_Ts.stream().reduce(identity, accumulator);
}
请注意,如果您想避免在实际调用它时传递这些内容,可以创建静态方法来执行调用:
public static int intSum(MyListOfNumbers<Integer> list) {
return list.sum(0, (a, b) -> a + b);
}
public static double doubleSum(MyListOfNumbers<Double> list) {
return list.sum(0, (a, b) -> a + b);
}
// etc.