别在于方法的显式类型returnsNull()会在编译时影响表达式的静态类型:
E1: `true ? returnsNull() : false` - boolean (auto-un@R_507_2419@ing 2nd operand to boolean)
E2: `true ? null : false` - Boolean (auto@R_507_2419@ing of 3rd operand to Boolean)
参见Java语言规范,第15.25节“ 条件运算符?”。:
如果第二个操作数和第三个操作数之一为布尔型,而另一个的类型为布尔型,则条件表达式的类型为布尔型。
由于表达式的类型为boolean
,因此第二个操作数必须强制为boolean
。编译器将自动拆箱代码插入第二个操作数(返回值returnsNull()
)以使其为type boolean
。这当然会导致null在运行时从返回的NPE 。
否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。