【问题标题】:Comparing Object and int in Java 7比较 Java 7 中的 Object 和 int
【发布时间】:2013-08-29 00:00:05
【问题描述】:

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

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

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

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

incomparable types: Object and int

但现在在 1.7 中编译正常。

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

【问题讨论】:

    标签: java eclipse compare java-7 autoboxing


    【解决方案1】:

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

    根本没有理由

    Object a= 5 ;
    

    是正确的,而不是表达方式

    a == 3
    

    甚至

    a == 5
    

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

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

    【讨论】:

    • 你的意思是它现在等同于new Object() == null 并且new Object() == 2 仍然会触发错误吗?
    • 它应该或多或少等同于new Object() == new Integer(0)(或new Integer(2))。它不应该是一个错误,并且永远是false,因为新的Object不能和Integer对象是同一个对象。
    • @MartijnCourteaux 不是真的。它相当于new Object() == Integer.valueOf(0)new Object() == Integer.valueOf(2)。当然,两者都会产生错误。
    • 在我看来,这在技术上是 1.6 中的一个错误。但我认为这会造成更多的麻烦,因为如果你不小心写了这样的东西,编译器不会警告你,而不是享受被允许写a == 3的好处。
    • 这是否意味着在Object a = 10000; boolean b = a == 10000; 中,b 将是false?因为 Integer.valueOf 缓存只到 128。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多