Java 将对象等同于布尔值-IntelliJ vs Eclipse

Java 将对象等同于布尔值-IntelliJ vs Eclipse,java,eclipse,intellij-idea,Java,Eclipse,Intellij Idea,我很好奇为什么下面这行代码在IntelliJ中运行良好,但在Eclipse中显示为错误(都使用Java 7): 我将此代码视为我们项目的一部分,起初我认为它不起作用,因为getClientProperty()返回一个对象,我们将其与布尔值进行比较。然而,对于我们这些使用IntelliJ的人来说,它工作得很好,但是对于团队中使用Eclipse的其他人来说,它显示为一个错误 我猜它在技术上是可行的,因为0==false可能是任何不是0==true的东西。然而,我不知道为什么一个IDE抱怨,而另一个没

我很好奇为什么下面这行代码在IntelliJ中运行良好,但在Eclipse中显示为错误(都使用Java 7):

我将此代码视为我们项目的一部分,起初我认为它不起作用,因为
getClientProperty()
返回一个
对象
,我们将其与
布尔值
进行比较。然而,对于我们这些使用IntelliJ的人来说,它工作得很好,但是对于团队中使用Eclipse的其他人来说,它显示为一个错误

我猜它在技术上是可行的,因为
0==false
可能是
任何不是0==true的东西。然而,我不知道为什么一个IDE抱怨,而另一个没有。哪一个是“正确的”

注意:上面这一行用于查找旧框架中的工具栏,该工具栏很难访问。此检查用于筛选和查找
原型工具栏
。我已经建议将此更改为使用
instanceof
检查类型,而不只是简单地检查它是否为真


谢谢

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

这不是将0视为假,将非0视为真。它有效地做到了这一点:

Object wrapped = true; // Autoboxing
return toolbar.getClientProperty("PrototypeToolbar") == wrapped;
如果
toolbar,则只返回
true
。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"));

如果
getClientProperty()
返回一个非布尔引用,或者
null
,或者
false
,则返回
false
,看起来这在JavaC1.7下是有效的代码,但在1.8下不是。我怀疑这是javac中的错误修复

这不是将0视为假,将非0视为真。它有效地做到了这一点:

Object wrapped = true; // Autoboxing
return toolbar.getClientProperty("PrototypeToolbar") == wrapped;
如果
toolbar,则只返回
true
。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"));

如果
getClientProperty()
返回一个非布尔引用,或者
null
,或者
false
,那么它将返回
false
true
框起来,并执行正常的引用比较。@JonSkeet如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型(§5.5),则这是编译时错误。两个操作数的运行时值必然不相等(忽略两个值均为null的情况)。也许…@SotiriosDelimanolis:你可以通过施放…@JonSkeet是的,这就是我的意思。@SotiriosDelimanolis:打得好。完成。@SotiriosDelimanolis:好吧,它使用javac为我编译。。。我相信它只是将
true
框起来,并执行正常的引用比较。@JonSkeet如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型(§5.5),则这是编译时错误。两个操作数的运行时值必然不相等(忽略两个值均为null的情况)。也许…@SotiriosDelimanolis:你可以通过施放…@JonSkeet是的,这就是我的意思。@SotiriosDelimanolis:打得好。完成。我认为
Boolean.TRUE.equals(属性)
会更简单。@khelwood:是的:)会编辑。太好了,谢谢。我们检查了它是否与1.7有关,甚至与1.7上的Eclipse和IntelliJ有关,只有Eclipse抱怨。如果我们将其设置为1.6,甚至IntelliJ也会抱怨。我认为
Boolean.TRUE.equals(属性)
会更简单。@khelwood:是的:)会编辑。太好了,谢谢。我们检查了它是否与1.7有关,甚至与1.7上的Eclipse和IntelliJ有关,只有Eclipse抱怨。如果我们将其设置为1.6,即使IntelliJ也会抱怨。