【问题标题】:Conditional operator, strange behavior [duplicate]条件运算符,奇怪的行为
【发布时间】:2015-02-01 20:06:32
【问题描述】:
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);
}

在上面的示例代码中,通过使用条件运算符 (? :),我可以在一行中重写上面的示例。所以,我认为 o1 & o2 的结果一定是一样的。但是,奇怪的是,结果如下:

5
5.0

你们能帮我指出为什么会这样吗?

更新: 结果将与以下代码相同:

Object o2 = true ? (Object) new Integer(5) : new Double(2.0);

【问题讨论】:

  • 我觉得在这两种情况下你都得到Integer很奇怪,但只是打印时的格式不同。
  • 是的,o1、o2 都是整数。
  • 我通过 instanceof 进行了尝试,第二个结果为 false。o1 instanceof Integer 结果为真,o2 instanceOf Integer 结果为假.. 所以这意味着 o2 不是整数
  • 这确实是非常奇怪的行为。 o2 实际上是双精度数。
  • 它绝对是一个 Double。我打印了类名。查看我关于自动装箱的答案

标签: java ternary-operator


【解决方案1】:

这似乎是自动装箱的副作用。这 ?运算符尝试确定可应用于 Object 的基本类型。它在右侧看到 Double 和 Integer,它也可以自动装箱为 Double。

可能是因为 Integer 可以装箱为 Double,但 Double 不能装箱为 Integer?

请注意,这会产生相同的结果...

Object o2 = true ? 5 : new Double(2.0);

【讨论】:

  • 我不明白。如何将new Integer(5) 自动装箱为Double?它已经是一个 Object 类型。
  • 它正在拆箱和重新装箱。我不是说我同意它,但这就是正在发生的事情。 System.out.println(o2.getClass());向您展示它是 Double 并且拳击是 Integer(5) 可以转换为 Double 的唯一方法
  • @Thilo 不是。应用了二进制数字提升。
  • 自动装箱为 Double(Integer(5))
  • 我担心如果我使用 Long 和 Float,它会返回相同的结果,但 Float 不涵盖 Long 类型
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2013-03-13
  • 2019-11-17
  • 2011-10-21
  • 2021-09-16
  • 2012-02-29
相关资源
最近更新 更多