有人可以解释为什么这个Java代码会编译吗?
public class Main {
public static void main(String []args){
System.out.println(foo(true));
System.out.println(foo(false));
}
public static boolean foo(boolean value) {
// this should make the compiler say something, at least complain a bit...
return value ? true : null;
}
}
答案 0 :(得分:1)
正如Oliver在评论中所说,编译的原因是自动装箱。
null
可以自动装入Boolean
,可以自动装箱到boolean
,让编译器感到满意。在运行时,自动装箱有效,但当它被取消装箱到boolean
时,它会抛出NullPointerException
。
答案 1 :(得分:0)
我们有什么样的条件表达式(JLS 15.25)?
boolean
的操作数,第3个操作数违反了null
对于引用条件表达式,表15.25-E指定boolean(2nd)和null(3rd)的组合确定完整表达式具有类型lub(Boolean,null)
对于运行时评估,这句话提供了所需的清晰度:
在运行时,首先计算条件表达式的第一个操作数表达式。如有必要,将对结果执行取消装箱转换。
根据第一个操作数,会发生以下情况之一:
true
自动退回到Boolean
,或 null
已经与Boolean
兼容(基于JLS-4.1)(这不是其他答案所声称的自动装箱)< / LI>
生成的Boolean
将被自动装箱,在第二种情况下会抛出NullPointerException
。