我已阅读以下问题Booleans, conditional operators and autoboxing。我想知道为什么包装类型取消装箱到原语而不是将原语装箱到包装器。这只是性能优化吗?
下面的条件表达式的类型是布尔值。还有一个隐藏的NPE。
表达式的第三个操作数(b1
)未装箱(抛出NPE)并立即重新装箱(如果没有异常)。
Boolean b1 = null;
Boolean b2 = null != b1 ? false : b1;
而不是这个,第二个操作数(原始假值)可以装箱为Boolean.FALSE。问题是,为什么第一种方式是首选?
关于条件表达式here的类型的解释。
- 如果第二个和第三个操作数之一是原始类型T,而另一个的类型是应用装箱转换的结果
(§5.1.7)到T,那么条件表达式的类型是T。
答案 0 :(得分:2)
考虑这种情况:
Boolean b1 = new Boolean(false); //I know you shouldn't be doing this but it's valid
boolean foo = b1 == false;
Boolean bar = b1 == false;
现在,如果事情像您预期的那样有效,foo
将为真,bar
将为假。或者,两者都可能是假的,但如果在表达式中只出现一个盒装基元,则意味着始终自动装箱。 (然后可能将其拆箱用于作业。)
我不认为这是一个很好的权衡。当然,从拆箱转换中处理NPE很难看,但在大多数拆箱方案中你都必须这样做。