在Java 7中比较Object和int

rsa*_*mei 15 java eclipse autoboxing compare java-7

我是一名高级解决方案架构师,但我最近偶然发现了一个让我停下来思考的问题......

对我来说,下面的代码总是应该触发错误,但当我的一位同事问我为什么Eclipse没有显示错误时,我无法回答任何问题.

class A {
    public static void main(String... args) {
        System.out.println(new Object() == 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经调查过,发现在源级别为1.6时确实会抛出一个错误:

incomparable types: Object and int
Run Code Online (Sandbox Code Playgroud)

但现在在1.7中编译好了.

请问,有哪些新功能可以保证这种行为?

Mar*_*ssi 9

你是什​​么意思"什么新功能可以保证这种行为?" ?1.7正在解决1.6中存在的问题. new Object() == 0应该从未产生错误,并始终导致自动装箱触发.

根本没有理由

Object a= 5 ;
Run Code Online (Sandbox Code Playgroud)

是正确的,而不是表达

a == 3
Run Code Online (Sandbox Code Playgroud)

甚至

a == 5
Run Code Online (Sandbox Code Playgroud)

这是非常奇怪的,恕我直言,与语言规范本身相矛盾.

从一个动态的角度,不过,a == 5仍计算为false消磨(Integer)a == 5,甚至(int)a == 5评估到true.原因是autounboxing被设计为永远不会产生ClassCastExceptions,因此静态地仅用于包装类型.后两种情况是显式强制转换,因此ClassCastException通常允许使用.

  • @MartijnCourteaux不是.它相当于`new Object()== Integer.valueOf(0)`和`new Object()== Integer.valueOf(2)`.当然,两者都会产生错误. (5认同)