为什么我不能使用数字界面进行计算?

Tomas Zato-恢复莫妮卡

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

  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来计算字节数组的平均值?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

我不是很明白为什么Number如果没有抽象数字我们会有接口

interface Number确实出于存储和转换表示的目的提取了数字。由于结果表示的类型没有很好地定义,因此不会出于计算目的而提取数字

上面的内容还清楚地表明,您可能将永远无法实现自己的数字实现(例如,对于某些非常怪异的实验数学程序,数字的大小和精度没有限制)。

BigDecimal 做到没有任何问题。

Number x = 0 实际上是有效的。

分配IntegerNumber就可以了。分配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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能使用预计在JUnit 4中

为什么我不能在界面中使用默认方法?

为什么我不能使用-fPIE进行编译,但可以使用-fPIC进行编译?

为什么我不能使用int访问map键?

为什么我不能使用Webpack编译SASS?

为什么不能使用普通变量进行多态?

为什么不能使用make_pair进行绑定?

为什么我不能使用低版本的buildTools?

为什么我不能使用Axios向GitHub REST API进行身份验证?

为什么我不能使用lambda按值对std :: map进行排序

为什么我不能使用WorldToViewportPoint进行2D鼠标移动

为什么在应用apply和pandas DateOffset的计算中不能使用数据框的数字索引?

laravel为什么我不能使用releationshiop进行数据获取与联接

为什么我不能使用asyncTask

为什么我不能使用链接的功能?

为什么我不能使用Python加载此页面?

为什么我不能使用静态IP地址对Google进行ping操作?

为什么我不能使用numpy.logaddexp.reduce?

为什么我不能使用私有抽象方法?

Javascript为什么我不能使用这样的数组,以及如何使用计算出的数字访问数组

为什么不能使用析构函数进行类化

为什么我的淡入淡出不能使用 jquery?

为什么我不能使用生成的名称进行迁移?

为什么我的 Eigen 代码不能使用更多线程进行缩放

为什么我不能使用 ConstaintLayout 属性

为什么我的 crontab 不能使用 /etc/crontab 文件

为什么我不能使用打字稿为我的自定义界面扩展 HTMLElement 类型?

为什么我不能使用函数在 javascript 中进行碰撞检查?

为什么我的 R 不能使用 rowSums 进行变异(错误:问题与 `mutate()` 输入 `..2`。x 'x' 必须是数字 ℹ 输入 `..2` 是 `rowSums(.)`。) ?