我想做这样的类来计算平均值:
public static class AverageValue<T extends Number> {
T data = 0; //ERROR: incompatible types: int cannot be converted to T
int count = 0;
public AverageValue() {}
public AverageValue(T data) {
this.data = data;
count = 1;
}
public void add(T num) {
data+=num; //ERROR: bad operand types for binary operator '+'
count++;
}
public T average() {
return data/(T)count; //ERROR: incompatible types: int cannot be converted to T
}
}
我真的不明白为什么如果没有抽象数字我们会有接口Number 。因为这就是接口的作用-用数据抽象操作而不自己保存数据。
上面的内容还清楚地表明,您可能将永远无法实现自己的数字实现(例如,对于某些非常怪异的实验数学程序,数字的大小和精度没有限制)。
我尝试了相同的结果,Number
而不是通用T
的。唯一的区别是Number x = 0
实际上是有效的。
有没有办法欺骗Java进行编译,还是我必须成为“专业” Java程序员并使用double来计算字节数组的平均值?
我不是很明白为什么
Number
如果没有抽象数字我们会有接口
interface Number
确实出于存储和转换表示的目的提取了数字。由于结果表示的类型没有很好地定义,因此不会出于计算目的而提取数字。
上面的内容还清楚地表明,您可能将永远无法实现自己的数字实现(例如,对于某些非常怪异的实验数学程序,数字的大小和精度没有限制)。
BigDecimal
做到没有任何问题。
Number x = 0
实际上是有效的。
分配Integer
给Number
就可以了。分配Integer
给扩展的内容Number
(例如Double
)是不正确的。这就是为什么存在差异的原因。
有没有办法欺骗Java进行编译,还是我必须全力以赴地
聘请专业Java程序员并使用double来计算字节数组的平均值?
计算平均值时,需要指定所需的结果表示形式。您可以自己将其抽象出来并提供“ averager”指尖,但是有关所需表示形式的信息需要以一种或另一种方式进入该方法:
interface AverageMaker<T extends Number> {
T initialResult();
T add(T a, Number b);
T divideByCount(T a, int b);
}
public static <T extends Number, R extends Number> R averageValue(Iterable<T> items, AverageMaker<R> maker) {
R res = maker.initialResult();
int count = 0;
for (T val : items) {
res = maker.add(res, val);
count++;
}
return maker.divideByCount(res, count);
}
定义几个普通制造者,如下所示:
static final AverageMaker<Double> doubleAvg = new AverageMaker<Double>() {
public Double initialResult() { return 0.0; }
public Double add(Double a, Number b) { return a + b.doubleValue(); }
public Double divideByCount(Double a, int b) { return a/b; }
};
static final AverageMaker<Integer> intAvg = new AverageMaker<Integer>() {
public Integer initialResult() { return 0; }
public Integer add(Integer a, Number b) { return a + b.intValue(); }
public Integer divideByCount(Integer a, int b) { return a/b; }
};
现在,您可以将它们与averageValue
方法一起在代码中使用:
List<Integer> a = new ArrayList<Integer>();
a.add(4);
a.add(8);
a.add(91);
a.add(18);
double avgDouble = averageValue(a, doubleAvg);
int avgInt = averageValue(a, intAvg);
System.out.println(avgDouble); // Prints 30.25
System.out.println(avgInt); // Prints 30
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句