首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么int-to-Object比较在Java 7中有效,而在Java 8中无效?

为什么int-to-Object比较在Java 7中有效,而在Java 8中无效?
EN

Stack Overflow用户
提问于 2015-09-17 22:04:57
回答 4查看 3.3K关注 0票数 61

下面的代码,

代码语言:javascript
复制
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不能让你比较intObject,而7可以。有关于这方面的文档吗?

我对这些决定的背景知识很感兴趣。看起来他们还没有做出决定。

我使用的是IntelliJ IDEA 14.1.4和JDK1.7.0.51。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-17 22:19:58

Java7将自动装箱应用于int。

代码语言:javascript
复制
 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被错误地键入。这些比较现在将被正确地标识为类型错误。

票数 30
EN

Stack Overflow用户

发布于 2015-09-17 22:23:46

JLS - Chapter 15. Equality Operators提到了3种不同的==运算符:数值运算符、布尔运算符和引用运算符。在您的示例中不会出现 of ==运算符,因此我们得出结论,语句是非法的

让我们来看看为什么==不能应用到您的示例中:

不用说为什么不是relevant..

如果相等运算符的操作数既是引用类型,也是null类型,则该操作是对象相等。

如果无法通过强制转换转换().将一个操作数的类型转换为另一个操作数的类型,则是编译时错误这两个操作数的运行时值必须为unequal.

如果相等运算符的操作数都是数值类型,或者其中一个是数值类型,另一个是可转换(§5.1.8)为数值类型的,则对操作数(§5.6.2).执行二进制数值升级

现在让我们假设它是合法的,并且编译器将行更改为:

代码语言:javascript
复制
if (a == new Integer(b))

你期望的结果是什么?条件的计算结果永远不会是true,所以 it是一个在Java8中修复的错误是有道理的。

票数 22
EN

Stack Overflow用户

发布于 2015-09-17 22:20:06

我不能得到一个用javac 1.7.0_75和javac 1.8.0_60编译的例子(修复bool→boolean)。我没有JDK6,但我认为它也不应该在那里工作。正如Axel所暗示的,这可能是早期的ecj不兼容,或者是javac的另一个次要版本中的错误。

在任何情况下,如果它工作,这是由于自动装箱。这可能是为了准备Java 8而减少的,因为流和自动装箱不能很好地混合在一起。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32632364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档