0

我想对所有数字集合进行总和。但我想指出返回号码类型。例如,我想做一个双集合的总和,但我想取回一个整数。我想要这样的 SumAggregator。这是我开发的代码,但我有一个 Cast 问题。

public class SumAggregator<N1 extends Number, N2 extends Number> {

    public SumAggregator() {

    }

    public N2 sum(Collection<? extends N1> list){
        Double sum = 0;
        for(Number n : list){
        sum += n.doubleValue();
        }
        return (N2) sum;
    }

}

如果我想这样做,SumAggregator<Double, Double>我没有任何问题。但是如果我想这样做SumAggregator<Double, Integer>,一旦我运行,我会得到以下异常: java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

知道如何解决这个问题吗?

4

2 回答 2

0

这是我选择的解决方案:

public class SumAggregator<N1 extends Number, N2 extends Number> {

    private final NumberConverter<N2> converter;

    public SumAggregator(NumberConverter<N2> converter) {
        this.converter = converter;
    }

    public N2 sum(Collection<? extends N1> list){
        double sum = 0;
        for(Number n : list){
            sum += n.doubleValue();
        }
        return converter.convert(sum);
    }

}

接着:

public interface NumberConverter<N2> {

    N2 convert(Number d);

    NumberConverter<Short> SHORT = new NumberConverter<Short>() {
        public Short convert(Number d) { 
            return d.shortValue(); 
        }
    };

    NumberConverter<Integer> INTEGER = new NumberConverter<Integer>() {
        public Integer convert(Number d) { 
            return d.intValue(); 
        }
    };

    NumberConverter<Double> DOUBLE = new NumberConverter<Double>() {
        public Double convert(Number d) { 
            return d.doubleValue(); 
        }
    };

    NumberConverter<Float> FLOAT = new NumberConverter<Float>() {
        public Float convert(Number d) { 
            return d.floatValue(); 
        }
    };

    NumberConverter<Long> LONG = new NumberConverter<Long>() {
        public Long convert(Number d) { 
            return d.longValue(); 
        }
    };

}
于 2013-08-05T17:14:43.340 回答
0

不完全是您想要的,但您可以执行以下操作:

interface DoubleConverter<N extends Number) {
    N2 convert(double d);
}

并向 SumAggregator 添加一个构造函数:

private final DoubleConverter<N2> converter;
public SumAggregator(DoubleConverter<N2> converter) {
    this.converter = converter;
}

你的方法看起来像:

public N2 sum(Collection<? extends N1> list){
    double sum = 0;
    for(Number n : list){
        sum += n.doubleValue();
    }
    return converter.convert(sum);
}

最后,您将创建一个:

SumAggregator<Double, Integer> a = new SumAggregator<> (new DoubleConverter<Integer>() {
    public Integer convert(double d) { return (int) d; }
});

最后,您可以在 DoubleConverter 接口中添加一些辅助方法:

DoubleConverter<Integer> INTEGER = new DoubleConverter<Integer>() {
    public Integer convert(double d) { return (int) d; }
}

所以调用代码可以使用:

SumAggregator<Double, Integer> a = new SumAggregator<> (DoubleConverter.INTEGER);
于 2013-08-04T21:21:33.780 回答