Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 条件运算符,奇怪的行为_Java_Ternary Operator - Fatal编程技术网

Java 条件运算符,奇怪的行为

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) :

在上面的示例代码中,通过使用条件运算符(?:),我可以在一行中重写上面的示例。因此,我认为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) : 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尝试了这一点,第二个结果是false
o1整数实例
结果为真,而
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);