很抱歉继续询问基础知识,但是我不明白这个简单的代码,以及为什么第一个print语句可以通过编译器ok甚至可以打印true,但是第二个print语句无法编译,给了我一个“无法比较的类型”错误:

int in1 = 38;
Number Nn1 = in1;
System.out.println(in1 == Nn1);
System.out.println(Nn1 == in1);


我没想到会有这个结果,我认为==是对称的很标准吗?

我正在使用javac 1.6.0_26以及NetBeans,但得到的结果相同,第一个println语句编译没有问题,第二个没有。

最佳答案

我相信,根据Java语言规范,任何方法都不能编译。

首先,重要的是要了解自动装箱仅适用于满足某些条件的表达式,并且仅适用于特定的包装器类(整数,长整数等,而不是数字)。

现在,在==的情况下,当
[原始]数字类型,另一个可以根据规则转换为[原始]数字类型(JLS 15.12.1)。正如我们刚才所说的,“根据规则”,Number不能转换为数字原始类型。

例如,并非不是应该将int转换为Integer,然后进行参考比较:未将自动装箱指定为应用于==参考比较(JLS 15.21.3)。

因此,如果您的编译器允许引用的代码进行编译,则它不遵守Java语言规范。

此行为很有意义,因为执行数字比较时,编译器需要知道两个操作数的实际特定类型才能执行数字提升。您可能认为您可以将数字与整数进行比较,并且编译器应仅对数字调用.intValue()。但这是不合适的,因为如果原始数字类型实际上是Float,则正确的比较实际上是先将整数转换为Float,而不是相反。换句话说,使用数字,编译器并不具有正确执行与原语的数字比较的所有信息。

关于java - Java中操作数排序的重要性==,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13436271/

10-12 04:41