为什么条件运算符的结果与预期相反?

Sne*_*sne 12 java operators

Object myObject = true ? new Integer(25) : new Double(25.0);

System.out.println(myObject);
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它输出25.0而不是25

这是怎么回事?

Era*_*ran 9

您的代码new Integer(25)按预期返回第二个操作数(),但Double由于以下规则,它将其转换为a .

这是JLS 15.25所说的:

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

  • 如果其中一个操作数的类型为字节或字节,另一个操作数的类型为short或Short,则条件表达式的类型为short.
  • 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么条件表达式的类型是T.
  • 如果其中一个操作数是T类型,其中T是Byte,Short或Character,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型U中表示,这是应用拆箱的结果转换为T,则条件表达式的类型为U.
  • 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型.
    请注意,二进制数字提升执行值集转换(第5.1.13节),并可执行拆箱转换(第5.1.8节).

和数字促销:

5.6.2.二进制数字促销

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:

如果任何操作数是引用类型,则进行拆箱转换(第5.1.8节).

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

如果任一操作数的类型为double,则另一个操作数转换为double.

在你的例子中,你有一个Integer和一个Double.他们是拆箱到intdouble,然后int转换为double.