我很好奇为什么以下行在IntelliJ中正常工作但在Eclipse中显示为错误(都使用Java 7):
return toolbar.getClientProperty("PrototypeToolbar") == true;
我看到这段代码是我们项目的一部分,起初我认为它不起作用,因为getClientProperty()
返回Object
,我们将它与boolean
进行比较。但是,对于我们这些使用IntelliJ的人来说,它可以正常工作,但对于正在使用Eclipse的团队中的其他人来说,它显示为错误。
我的猜测是技术上可以工作,因为0 == false
可能是anything not 0 == true
。但是,我不确定为什么一个IDE抱怨而另一个不抱怨。哪一个'对'?
注意:上面的行用于查找作为旧框架一部分且难以访问的工具栏。此检查用于过滤和查找PrototypeToolbar
。我已经建议改变这一点,只需检查是否使用instanceof
检查类型是否正确。
谢谢!
答案 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
。