【问题标题】:Wrappers and Auto-boxing包装器和自动装箱
【发布时间】:2017-01-23 10:19:43
【问题描述】:

有如下代码:

Integer time = 12;
Double lateTime = 12.30;
Boolean late = false;
Double result = late ? lateTime : time;  //Why here can I assign an Integer to a Double?
System.out.println(result);

打印出来:

12.0

这个不能编译。为什么?

Integer time = 12;
Double lateTime = 12.30;
Double result = time;      //Integer cannot be converted to Double
System.out.println(result);

【问题讨论】:

标签: java wrapper autoboxing


【解决方案1】:

差异是由于 Java 中的三元运算符行为造成的。


三元条件案例:

在表达式late ? lateTime : time 中,Java 将自动将其中一个参数(根据late 的值)自动拆箱为其各自的原始类型。 (您可以通过将time 设置为null 并将late 设置为true 来观察这一点:NullPointerException抛出。同样适用于将lastTime 设置为nulllatefalse。)

如果表达式的值为time,则加宽double

在任何一种情况下,生成的double 在分配给result 时都会自动装箱为Double


简单的赋值案例:

在写Double result = time; 时,Java 不允许这样做,因为它希望您更加明确。


就我个人而言,我发现 Java 三元条件运算符相对于盒装原始类型的机制是该语言中最有害的部分之一。

【讨论】:

  • 好的,但在第一个示例中,“结果”始终是 Double 还是被转换为 Integer?
  • @Eran:我已经更明确地说明了确切的机制,并添加了 NPE 刺痛。
  • 双重结果=时间+1.0;也会编译。实际上 + 0.0 也是如此;并且 +1 只是为了使用有害这个词。
  • @Eran:是的,我不准确。我也检查并修改了答案。
  • @Eran:我还是错了,只有 一个 参数是自动拆箱的。我想我现在拥有它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多