3
回答
Java 运算符(?:)的一个奇怪现象
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   


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吗?


举报
zgw06629
发帖于2年前 3回/360阅
共有3个答案 最后回答: 2年前

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的介绍。

--- 共有 1 条评论 ---
zgw06629多谢 2年前 回复
其实看到这个,我还奇怪呢,难道下面的不应该是Long吗?哈哈,好吧。我之前觉得都是Long才是正常的,汗。。
顶部