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需要确切地知道它正在处理什么类型的数字来执行装箱/拆箱.