为什么在Java自动转换数字中使用内联条件?

Gar*_*all 5 java

在下面的内联条件中,可能会分别打印一个整数和一个double:

System.out.println(true ? 0 : 0.0);
System.out.println(false ? 0 : 0.0);
System.out.println(true ? new Integer(0) : new Double(0.0));
System.out.println(true ? 0 : "");
Run Code Online (Sandbox Code Playgroud)

相反,它们在一起出现时都被打印为双打:

 0.0
 0.0
 0.0
 0
Run Code Online (Sandbox Code Playgroud)

为什么在内联条件下与其他数字一起出现时会自动转换数字?

编辑:如果发生这种情况,因为System.out.println重载的情况是这样的:

list.add(true ? 0 : 0.0);
list.add(false ? 0 : 0.0);
list.add(true ? new Integer(0) : new Double(0.0));
list.add(true ? 0 : "");
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

输出:

[0.0, 0.0, 0.0, 0]
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

为什么在内联条件下与其他数字一起出现时会自动转换数字?

条件表达式必须具有单个结果类型,并且该类型用于确定System.out.println要使用的重载.重载始终在编译时确定,编译器根据选择的条件采用两个完全独立的路径,这将是非常不方便的.

如果您根据条件做两件事,请使用if.如果要根据条件在两个值之间选择一种结果类型,则条件运算符是完美的.

编辑:这里有趣的案例,IMO,是第三个.编译器本可以选择不执行任何转换,只需调用即可println(Object).为了表明它没有这样做,这是一个单独的测试:

Object x = true ? new Integer(0) : new Double(0.0);
System.out.println(x.getClass());
Run Code Online (Sandbox Code Playgroud)

这打印出来class java.lang.Double- 如果你看一下字节码,你会看到它被拆箱int然后重新装箱它Double.有关如何确定所有内容的详细信息,请参阅JLS的第15.25节.