将对象等同于布尔 - IntelliJ与Eclipse

时间:2016-01-05 17:06:04

标签: java eclipse intellij-idea

我很好奇为什么以下行在IntelliJ中正常工作但在Eclipse中显示为错误(都使用Java 7):

return toolbar.getClientProperty("PrototypeToolbar") == true;

我看到这段代码是我们项目的一部分,起初我认为它不起作用,因为getClientProperty()返回Object,我们将它与boolean进行比较。但是,对于我们这些使用IntelliJ的人来说,它可以正常工作,但对于正在使用Eclipse的团队中的其他人来说,它显示为错误。

我的猜测是技术上可以工作,因为0 == false可能是anything not 0 == true。但是,我不确定为什么一个IDE抱怨而另一个不抱怨。哪一个'对'?

注意:上面的行用于查找作为旧框架一部分且难以访问的工具栏。此检查用于过滤和查找PrototypeToolbar。我已经建议改变这一点,只需检查是否使用instanceof检查类型是否正确。

谢谢!

1 个答案:

答案 0 :(得分:3)

看起来这是javac 1.7下的有效代码,但不低于1.8。我怀疑这是javac中的错误修复。

这不是将0视为假,而将任何非0视为真。它实际上是这样做的:

Object wrapped = true; // Autoboxing
return toolbar.getClientProperty("PrototypeToolbar") == wrapped;

如果true返回相同的引用,则只会返回toolbar.getClientProperty(...) - 例如如果它的值为true,或者明确地称为Boolean.valueOf(true)

样品:

// Compiles under 1.7 but not 1.8
public class Test {
    public static void main (String args[]) {
        Object x = Boolean.valueOf(true);
        Object y = new Boolean(true);
        System.out.println(x == true); // Prints true
        System.out.println(y == true); // Prints false
    }
}

我怀疑你的代码应该重构为:

return Boolean.TRUE.equals(toolbar.getClientProperty("PrototypeToolbar"));

如果false返回非布尔引用,或getClientProperty()null,则会返回false