下面的代码,
private boolean compare(Object a, int b) {
return a == b;
}在Java 7中编译,但在Java 8中导致以下错误:
不可比拟的类型: int和Object
看看下面的问题:
Comparing Object and int in Java 7
看起来Java6和Java8不能让你比较int和Object,而7可以。有关于这方面的文档吗?
我对这些决定的背景知识很感兴趣。看起来他们还没有做出决定。
我使用的是IntelliJ IDEA 14.1.4和JDK1.7.0.51。
发布于 2015-09-17 22:19:58
Java7将自动装箱应用于int。
private boolean compare(java.lang.Object, int);
Code:
0: aload_1
1: iload_2
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: if_acmpne 12
8: iconst_1
9: goto 13
12: iconst_0
13: ireturn这是我用build 1.7.0_71-b14创建的
编辑:
此行为被Oracle识别并视为错误:
JDK-8013357:Javac接受错误的二进制比较操作
相关的JLS节是15.21。Javac似乎将其视为引用比较,但只有当两个操作数都是引用类型时,才允许进行引用比较。
JLS第15.21节中用于二进制比较的类型规则现在将由javac正确执行。自从JDK5以来,javac已经接受了一些具有对象基元比较的程序,这些程序根据JLS15.21被错误地键入。这些比较现在将被正确地标识为类型错误。
发布于 2015-09-17 22:23:46
JLS - Chapter 15. Equality Operators提到了3种不同的==运算符:数值运算符、布尔运算符和引用运算符。在您的示例中不会出现 of ==运算符,因此我们得出结论,语句是非法的。
让我们来看看为什么==不能应用到您的示例中:
不用说为什么不是relevant..
如果相等运算符的操作数既是引用类型,也是null类型,则该操作是对象相等。
如果无法通过强制转换转换().将一个操作数的类型转换为另一个操作数的类型,则是编译时错误这两个操作数的运行时值必须为unequal.
如果相等运算符的操作数都是数值类型,或者其中一个是数值类型,另一个是可转换(§5.1.8)为数值类型的,则对操作数(§5.6.2).执行二进制数值升级
现在让我们假设它是合法的,并且编译器将行更改为:
if (a == new Integer(b))你期望的结果是什么?条件的计算结果永远不会是true,所以 it是一个在Java8中修复的错误是有道理的。
发布于 2015-09-17 22:20:06
我不能得到一个用javac 1.7.0_75和javac 1.8.0_60编译的例子(修复bool→boolean)。我没有JDK6,但我认为它也不应该在那里工作。正如Axel所暗示的,这可能是早期的ecj不兼容,或者是javac的另一个次要版本中的错误。
在任何情况下,如果它工作,这是由于自动装箱。这可能是为了准备Java 8而减少的,因为流和自动装箱不能很好地混合在一起。
https://stackoverflow.com/questions/32632364
复制相似问题