【发布时间】:2013-05-22 03:31:03
【问题描述】:
以下代码
public class TestComparison {
public static void main(String[] args) throws Exception {
boolean b = true;
Object o = new Boolean(true);
System.out.println("comparison result: "+
(o == b)); // Eclipse complains about this expression
}
}
使用javac V1.7.0_15 编译没有错误,并在运行时打印“false”。然而,Eclipse Juno 抱怨“不兼容的操作数类型 Object 和 boolean”。
显然 javac 将原始布尔值 b 自动装箱,然后通过对象相等性比较 o 和自动装箱的 b,产生 false,而 Eclipse 拒绝进行自动装箱。
根据 Java 语言规范,哪种行为是正确的?我应该在哪里提交错误?
注意:如果我将o 的类型更改为Boolean,事情会按预期工作:Eclipse 接受代码,并且代码打印“true”。
【问题讨论】:
-
检查你的 Eclipse 设置,看看是否有什么奇怪的地方:项目属性 -> Java 编译器 -> 错误/警告 -> 潜在的编程问题
-
取决于您的“预期” - 它应该框
b并使用引用相等(打印为 false)还是取消框o并使用原始布尔相等(打印为 true)? -
@IanRoberts:后者做不到;
o的静态类型是Object。 -
在 java 6 中代码无法编译。似乎 java 6 和 7 之间的规范发生了一些变化,允许这种行为,请参阅此问题的答案:stackoverflow.com/questions/16119638/…。相关部分是:通过取消装箱转换,引用类型的表达式可以毫无错误地转换为原始类型。
标签: java eclipse javac autoboxing