当前位置: 首页 > 面试题库 >

java.lang.Number没有实现“ +”或任何其他运算符?

谢鸿羲
2023-03-14
问题内容

我正在创建一个应该与任何类型的数字(浮点数,整数等)的数组一起使用的类,因此,这里有一种方法:

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

否则将无法编译,因为“ Number”没有实现“ + =”或“ / =”运算符。更糟糕的是,java的Number类甚至没有实现最基本的运算符,例如“
+”或“-”!如果java因为认为无法添加数字而不允许我进行编译,那么如何制作一个返回数字数组平均值的方法呢?


问题答案:

您误解了数字在Java中的工作方式。的Number类是数字包装类(的超类IntegerFloat等)用于表示原始类型(有用intfloat等)为对象,但它确实
与通常的算术运算符的工作。

如果打算使用算术运算符,请使用基本类型。如果需要构建适用于所有数值数据类型的“通用”方法,则别无选择,只能构建同一方法的多个重载版本,例如,每种数据类型都应重载一个版本:

public  float[] average(float[][]  queue) {...}
public double[] average(double[][] queue) {...}

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

Integer i = 0;
i += 1;
System.out.println(i);

......但引擎盖下,Java是自动装箱和拆箱的Integer,因为+=运营商只适用于原始类型。之所以起作用,是因为我们明确指出该数字为Integer,但不适用于Number,因为Java需要准确
知道 它要执行装箱/拆箱处理的数字类型。



 类似资料:
  • 问题内容: 到目前为止,我一直没有通过网络进行搜索,该语句始终具有if和else条件,例如。我想知道三元语句是否可以不使用。假设我有以下代码,如果不为空,我想关闭 (我正在使用Java编程语言。) 问题答案: 不,你不能那样做。 而是尝试以下方法:

  • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

  • 问题内容: 有谁知道为什么 不执行?这意味着您无法对排序,这在我看来有点奇怪。 讨论后更新: 感谢所有有用的回复。最后,我对该主题进行了更多研究。 为什么java.lang.Number不实现Comparable的最简单解释源于可变性问题。 对于位的检讨,是抽象的超类型的,,,,,,,,和。在该列表中,并以没有实现。 深入研究,我发现在可变类型上实现不是一种好习惯,因为在比较期间或之后对象可能会更

  • 据我所知,Java中的String concatenation""运算符是使用Stringbuilder实现的,例如: 内部编译为: 所以我尝试了这样的东西: 接下来,我使用==运算符相互测试了这些。结果主要是我所期望的:foo2和foo4没有为任何其他字符串返回“==”。 但是,fo3==fo1返回true。这是什么原因?StringBuilder类的toString方法内部调用“new Str

  • A task is special because knowing when a task is about to exit is useful in these circumstances: Frameworks know when to render the UI. Measuring enter/leave allows knowing total script/task time. Exi