Mar*_*ler 2 java autoboxing language-design conditional-operator
一个简单的表达:
Object val = true ? 1l : 0.5;
Run Code Online (Sandbox Code Playgroud)
什么类型的val?嗯,从逻辑上讲,val应该是值为1的Long对象.但Java认为val是一个值为1.0的Double.
它不需要任何与自动装箱有关的东西
Object val = true ? new Long(1) : new Double(0.5);
Run Code Online (Sandbox Code Playgroud)
结果具有相同的行为.
只是为了澄清:
Object val = true ? "1" : 0.5;
Run Code Online (Sandbox Code Playgroud)
得到正确的字符串.
谁能解释一下为什么他们这样定义了这个?对我而言,设计似乎相当糟糕或实际上是一个错误.
这在Java语言规范第15.25节(粗体相关部分)中进行了描述:
条件表达式的类型确定如下:
如果第二个和第三个操作数具有相同的类型[...]
如果第二个和第三个操作数之一是boolean类型[...]
如果第二个和第三个操作数之一是null类型[...]
否则,如果第二个和第三个操作数具有可转换(第5.1.8节)到数字类型的类型,则有几种情况:
如果其中一个操作数是byte [...]类型
如果其中一个操作数是T类型,其中T是byte,short或char,[...]
如果其中一个操作数是Byte [...]类型
如果其中一个操作数是Short [...]类型
如果其中一个操作数是类型的; 性格[...]
否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型.请注意,二进制数字促销执行拆箱转换(第5.1.8节)和值集转换(第5.1.13节).
否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.
最后一段中提到的"lub"代表最小上限,并且指的是T1和T2中最常见的超常类型.
至于这种情况,Object val = true ? 1l : 0.5;我同意如果它适用规则5(在盒装值上)会更精确.我想在考虑自动装箱时,规则会变得含糊不清(甚至更复杂).例如表达式b ? new Byte(0) : 0.5会有什么类型?
但是,您可以通过执行来强制它使用规则5
Object val = false ? (Number) 1L : .5;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |