Java 如何将抽象数初始化为0?

Java 如何将抽象数初始化为0?,java,templates,initialization,Java,Templates,Initialization,我想初始化一个扩展了Number类的变量。我的测试: class IgniteReducer<T extends Number> { private T sum = (Number) 0; // Here I have the problem public boolean collect(T number) { sum += number; return true; } public T reduce() {

我想初始化一个扩展了Number类的变量。我的测试:

class IgniteReducer<T extends Number> {

    private T sum = (Number) 0; // Here I have the problem

    public boolean collect(T number) {
        sum += number;
        return true;
    }

    public T reduce() {
        return sum;
    }

}
类减速器{
private T sum=(Number)0;//这里有个问题
公共布尔集合(T编号){
总和+=数字;
返回true;
}
公营部门{
回报金额;
}
}

有人知道如何解决这个初始化问题吗?

你不能这么做。没有通用方法将编号设置为0。正如Joni在评论中所说,也没有通用的方法来添加相同子类
Number
的两个实例

一种选择是将这两个操作推迟到知道
T
表示的具体类型的子类。所以你的主类必须是抽象的

abstract class IgniteReducer<T extends Number> {

    protected T sum = zero();

    protected abstract T zero();

    public abstract boolean collect(T number);

    public T reduce() {
        return sum;
    }

}
抽象类{
受保护的T和=零();
受保护的抽象T零();
公共抽象布尔集合(T数);
公营部门{
回报金额;
}
}
一个具体的实施可以是:

class IgniteFloatReducer extend IgniteReducer<Float> {

    Float zero() {
        return 0;
    }

    public boolean collect(Float number) {
        sum += number;
        return true;
    }

}
class IgniteFloatReducer扩展IgniteReducer{
浮点零(){
返回0;
}
公共布尔集合(浮点数){
总和+=数字;
返回true;
}
}

我在这里输入的代码没有经过测试,因此请原谅任何打字错误。

T扩展数字时
,您为什么在这里强制转换
T sum=(数字)0
?这里已经给出了答案:您想做什么?这些是标准库中
Number
的子类,其中任何一个都没有定义“+”:AtomicInteger、AtomicLong、BigDecimal、BigInteger、Byte、Double、DoubleAccumulator、DoubleAdder、Float、Integer、Long、LongAccumulator、LongAdder、Short