Java 运算符(?:)的一个奇怪现象

zgw06629 发布于 2015/10/26 17:01
阅读 366
收藏 1


long id = 2L;

Object key = (id <= Integer.MAX_VALUE ? (int) id : id);
System.out.println(key.getClass()); // class java.lang.Long

Object key3 = null;
if (id <= Integer.MAX_VALUE)
    key3 = (int) id;
else
    key3 = id;
System.out.println(key3.getClass()); // class java.lang.Integer


为什么用?:得到的始终是Long型? 是bug吗?


加载中
0
狐狸糊涂
狐狸糊涂

jls里面对条件操作运算有描述:

Otherwise, if the second and third operands have types that are convertible (§5.1.8) to numeric types, then there are several cases: 
...... 
Otherwise, binary numeric promotion (§5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs value set conversion (§5.1.13) and may perform unboxing conversion (§5.1.8).

如果第二个和第三个操作数都是数字类型的话是有可能会发生binary numeric promotion的,就是类型提升,第一个表达式里面,第三个操作数是long,就算第二个是(int)id被返回,也是要先转换成long类型的。


注:我这里忽略了之前的几条规则,有兴趣可以翻看一下jls对Conditional Operator的介绍。

zgw06629
zgw06629
多谢
0
岚宝
岚宝
Java的三目运算符在类型不一致时会进行类型提升
0
sxgkwei
sxgkwei
其实看到这个,我还奇怪呢,难道下面的不应该是Long吗?哈哈,好吧。我之前觉得都是Long才是正常的,汗。。
返回顶部
顶部