15

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

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

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

我调查并发现使用源级别 1.6 确实会引发错误:

incomparable types: Object and int

但现在在 1.7 中它可以编译。

请问,什么新功能确实保证了这种行为?

4

1 回答 1

9

“什么新功能确实保证了这种行为”是什么意思?? 1.7 正在修复 1.6 中存在的问题。 new Object() == 0应该永远不会产生错误,并且总是会导致自动装箱触发。

根本没有理由

Object a= 5 ;

是正确的,而不是表达

a == 3

甚至

a == 5

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

但是,从动态的角度来看,a == 5仍然评估为falsewhile(Integer)a == 5甚至(int)a == 5评估为true。原因是自动拆箱被设计为永远不会产生ClassCastExceptions ,因此仅静态地发生在包装器类型上。后两种情况是显式转换,因此ClassCastException通常允许使用 s。

于 2013-08-29T00:05:27.990 回答