当前位置: 首页 > 面试题库 >

使用条件运算符的奇怪Java行为。是虫子吗?

翟凯
2023-03-14
问题内容

您能否运行以下内容并进行解释?

Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);

我发现令人惊讶,因为有人期望打印1而不是1.0


问题答案:

尽管看起来好像一个,但这一点也不令人惊讶。该行为在JLS§15.25-条件运算符中指定:

否则,如果第二个和第三个操作数的类型可以转换(第5.1.8节)为数字类型,则有几种情况:

  • 如果其中一个操作数的类型为byteByte,而另一个操作符的类型为shortShort,则条件表达式的类型为
    short

[…]

  • 否则,将二进制数值提升(第5.6.2节)应用于操作数类型, 条件表达式的类型为第二和第三操作数的提升类型。

请注意,二进制数值升级执行值集转换(第5.1.13节),并且可能 执行拆箱转换 (第5.1.8节)。

因此,IntegerDouble类型作为二进制数值提升的过程被取消装箱到它们各自的原始副本-
intdouble。然后,条件运算符的类型是intand
的提升类型double,即double。因此结果是1.0。然后,当然会将最终结果装箱到Double



 类似资料:
  • 问题内容: 为什么此代码有效? 为什么这会引发异常? 但是最奇怪的是,该代码也可以成功运行,没有任何异常: 看来Java的三元运算符会改变行为。有人可以解释为什么吗? 问题答案: 该行为在JLS- 条件运算符中 指定: 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。 强调我的。因此,在第二种情况下: 由于第三个操作

  • 但最奇怪的是,这段代码也在没有任何异常的情况下成功运行: 看起来Java的三元运算符改变了行为。有人能解释一下这是为什么吗?

  • 这个程序打印00,但是如果我注释掉a.store和b.store,而取消注释a.fetch_add和b.fetch_add,这做了完全相同的事情,即都设置了a=1,b=1的值,我永远不会得到00。 是我错过了什么,还是“00”按标准永远不会出现? 下面打印00。 下图从不打印00 再看看这个,多线程原子a b打印00 for memory_order_refield

  • 你认为这个表达的结果是什么? 不!!!是15! 现在让我们看看另一个类似的说法: 还是不,现在是10。为什么呢?我不明白。但是等等,还有两个: 最后一点: 那么有人能告诉我们为什么javascript会这样吗?

  • 问题内容: 请考虑以下代码片段: 据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。 如您所料,我宁愿写最后2行而不是前7行。但是,当我向该方法传递3个空值时,在变量的计算上得到了NPE 。 有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分吗? (Java版本1.6.0_21) 问题答案: 尝试: 要么 三元运算符的交替边的类型是和,这意味着将get取消装箱到,然后在赋值

  • 问题内容: 我有一个小文件,其中包含一些我想用“ |”分割的内容 字符。 当我尝试使用其他任何字符(例如“>”)时,它都可以正常工作,但是使用“ |” 性格,有一些意想不到的结果。 行本身(此处带有 >字符) addere> to add>(1) 分割“ >”结果 [加法,加法(1)] 分割“ |” 结果 [,a,d,d,e,r,e,|,t,o,,a,d,d,|,(,1,)] 为什么要拆分所有内容