java.lang.Number不实现"+"或任何其他运算符?

Das*_*tor 9 java numbers add operators implements

我正在创建一个类,它应该能够与任何类型的数组(float,int等)一起使用,所以这里有一个方法:

// T extends Number
public synchronized T[] average() {
    Number[] ret = new Number[queue[0].length];
    for (int i = 0; i < ret.length; ++i) {
        for (int j = 0; j < size; ++j) {
            ret[i] += queue[j][i]; // WTF ERROR?!
        }
        ret[i] /= size; // WTF ERROR?!
    }
    return (T[])ret;
}
Run Code Online (Sandbox Code Playgroud)

除此之外不会编译因为"Number"没有实现"+ ="或"/ ="运算符.更糟糕的是,java的Number类甚至没有实现最基本的运算符,如"+"或" - "!如果java不允许我编译它,我怎么能创建一个返回Numbers数组平均值的方法,因为它认为数字不能被添加?!?!

Ósc*_*pez 11

你误解了数字在Java中的工作方式.的Number类是数值包装类的超类(Integer,Float等),用于代表原始类型(有用int,float等)为对象,但它不能与通常的算术运算符工作.

如果您打算使用算术运算符,则使用原始类型.如果需要构建适用于所有数值数据类型的"通用"方法,则别无选择,只能构建同一方法的多个重载版本,每种数据类型一个,例如:

public  float[] average(float[][]  queue) {...}
public double[] average(double[][] queue) {...}
Run Code Online (Sandbox Code Playgroud)

还要注意这样的代码似乎适用于包装器类型:

Integer i = 0;
i += 1;
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

......但引擎盖下,Java的自动装箱和拆箱Integer,因为+=运营商只适用于原始类型.它的工作原理是因为我们明确指出数字是一个Integer,但它不适用于a Number,因为Java需要确切地知道它正在处理什么类型的数字来执行装箱/拆箱.

  • 除了不使用算术运算符之外,Number API不提供任何执行算术的方法. (5认同)