Java 条件运算符,奇怪的行为
在上面的示例代码中,通过使用条件运算符(?:),我可以在一行中重写上面的示例。因此,我认为o1和o2的结果必须是相同的。但奇怪的是,结果如下:Java 条件运算符,奇怪的行为,java,ternary-operator,Java,Ternary Operator,在上面的示例代码中,通过使用条件运算符(?:),我可以在一行中重写上面的示例。因此,我认为o1和o2的结果必须是相同的。但奇怪的是,结果如下: public static void main(String[] args) { Object o1; if (true) o1 = new Integer(5); else o1 = new Double(2.0); Object o2 = true ? new Integer(5) :
public static void main(String[] args) {
Object o1;
if (true)
o1 = new Integer(5);
else
o1 = new Double(2.0);
Object o2 = true ? new Integer(5) : new Double(2.0);
System.out.println(o1);
System.out.println(o2);
}
你们能帮我指出为什么会有这种行为吗
已更新:
结果将与以下代码相同:
5
5.0
这似乎是自动装箱的副作用。这个运算符尝试确定可以应用于对象的基类型。它在右边看到Double和Integer,它们也可以自动装箱为Double 可能是因为整数可以装箱为双精度,但双精度不能装箱为整数 请注意,这会产生相同的结果
Object o2 = true ? (Object) new Integer(5) : new Double(2.0);
我觉得奇怪的是,在这两种情况下都得到了
Integer
,但只是打印时的格式不同。是的,o1和o2都是整数。我通过执行instanceof尝试了这一点,第二个结果是falseo1整数实例
结果为真,而o2整数实例
结果为假。。这意味着o2不是一个整数,这确实是一个非常奇怪的行为。o2实际上是一个双倍体,很明显是一个双倍体。我打印了类名。在Autoboxigi上看到我的答案,我不明白。如何将新整数(5)
自动装箱到双精度
?它已经是一个对象类型。正在取消绑定并重新绑定它。我不是说我同意这一点,但事实就是如此。System.out.println(o2.getClass());向您显示它是一个双精度数,装箱是将整数(5)转换为Double@Thilo事实并非如此。应用了二进制数字提升。它将其自动装箱为Double(整数(5))。我担心如果我使用Long和Float,它将返回相同的结果,但Float不包含Long类型
Object o2 = true ? 5 : new Double(2.0);