为什么包装类型未装箱而不是装箱原语?
Why wrapped type unboxed instead of boxing the primitive?
我已阅读以下问题 Booleans, conditional operators and autoboxing。我想知道为什么将包装类型拆箱到原语而不是将原语装箱到包装器。这只是性能优化吗?
详情
下面的条件表达式类型是布尔值。并且有一个隐藏的 NPE。
表达式的第三个操作数 (b1
) 取消装箱(抛出 NPE)并立即重新装箱(如果没有异常)。
Boolean b1 = null;
Boolean b2 = null != b1 ? false : b1;
取而代之的是,第二个操作数(原始假值)可以装箱到 Boolean.FALSE。问题是,为什么首选第一种方式?
关于条件表达式类型的说明here。
- If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion
(§5.1.7) to T, then the type of the conditional expression is T.
考虑这种情况:
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 是丑陋的,但在大多数拆箱场景中,这是您必须做的事情。
我已阅读以下问题 Booleans, conditional operators and autoboxing。我想知道为什么将包装类型拆箱到原语而不是将原语装箱到包装器。这只是性能优化吗?
详情
下面的条件表达式类型是布尔值。并且有一个隐藏的 NPE。
表达式的第三个操作数 (b1
) 取消装箱(抛出 NPE)并立即重新装箱(如果没有异常)。
Boolean b1 = null;
Boolean b2 = null != b1 ? false : b1;
取而代之的是,第二个操作数(原始假值)可以装箱到 Boolean.FALSE。问题是,为什么首选第一种方式?
关于条件表达式类型的说明here。
- If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion
(§5.1.7) to T, then the type of the conditional expression is T.
考虑这种情况:
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 是丑陋的,但在大多数拆箱场景中,这是您必须做的事情。