gpt4 book ai didi

java - 为什么我不能用Number接口(interface)计算?

转载 作者:行者123 更新时间:2023-12-03 23:14:54 24 4
gpt4 key购买 nike

我想创建这样的类来计算平均值:

  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
}
}

如果它不抽象数字,我真的不明白为什么我们有接口(interface) Number。因为这就是接口(interface)的作用 - 对数据进行抽象操作而不保存数据本身。

以上内容也清楚地表明,您可能永远无法实现自己的数字实现(例如,对于一些非常怪异的实验性数学程序,数字的大小和精度不受限制)。

我用 Number 而不是通用 T 进行了相同的尝试,结果完全相同。唯一的区别是 Number x = 0 实际上是有效的。

有没有办法欺骗 java 来编译它,还是我必须是“专业”java 程序员并使用 double 来计算字节数组的平均值?

最佳答案

I am not really getting why do we have interface Number if it doesn't abstract number

interface Number 确实出于存储和转换表示的目的对数字进行抽象。它不会为了进行计算而抽象数字,因为结果的类型表示没有明确定义。

The above also makes it clear that you'll probably not be ever able to make your own number implementation (eg. number with unlimited size and precision for some really freaky experimental math programs).

BigDecimal 没有任何问题。

Number x = 0 is actually valid.

Integer 分配给 Number 就可以了。将 Integer 分配给扩展 Number 的对象(例如,Double)是不可行的。这就是存在差异的原因。

Is there a way to trick java to compile this or do I have to go full retard professional Java programmer and use doubles to calculate averages on byte arrays?

计算平均值时,您需要指定所需的结果表示形式。您可以自己将其抽象出来并提供“平均器”接口(interface),但是有关所需表示的信息需要以一种或另一种方式进入方法:

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

Demo.

关于java - 为什么我不能用Number接口(interface)计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29943157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com