在 Java 7 中比较对象和 int

2022-09-03 15:39:43

我最近偶然发现了一个问题,这个问题让我停下来思考......

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

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

我已经调查并发现源代码级别为1.6,它确实会抛出一个错误:

incomparable types: Object and int

但是现在在1.7中,它编译正常。

请问,什么新功能可以保证这种行为?


答案 1

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

根本没有理由

Object a= 5 ;

是正确的,而不是表达式

a == 3

甚至

a == 5

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

但是,从动态的角度来看,仍然评估为 while 甚至评估为 .原因是自动取消装箱被设计为从不生成 s,因此仅静态地针对包装器类型发生。后两种情况是显式强制转换,因此通常允许使用。a == 5false(Integer)a == 5(int)a == 5trueClassCastExceptionClassCastException


答案 2