您认为以下代码段会显示什么?
Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);
是! 它将打印:
1.0
什么? 1.0? 但是我已经为我的o
变量分配了一个Integer
。 为什么打印1.0? 事实证明,JLS的§15.25中有一个微妙的小规范部分,它指定了三元运算符。 以下是适用于以上内容的内容:
条件表达式的类型确定如下:
- […]
- 否则,如果第二个和第三个操作数具有可转换为数字类型(第5.1.8节 )的类型,则有以下几种情况:
- […]
二进制数值提升可能会隐式执行拆箱转换! ek! 谁会想到这个? 您可以从自动拆箱中获取NullPointerException,如果其中一个操作数为null
,则以下操作将失败
Integer i = new Integer(1);
if (i.equals(1))
i = null;
Double d = new Double(2.0);
Object o = true ? i : d; // NullPointerException!
System.out.println(o);
显然(显然!!),可以通过将数字类型转换为非数字类型来规避此问题,例如Object
Object o1 = true
? (Object) new Integer(1)
: new Double(2.0);
System.out.println(o1);
上面将打印
1
保罗·米纳(Paul Miner)是发现这一难题的功劳,他在reddit上对此进行了更详细的解释。
翻译自: https://www.javacodegeeks.com/2013/10/java-auto-unboxing-gotcha-beware.html