java - 包装器和自动装箱

标签 java wrapper autoboxing

有如下代码:

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 中的三元运算符行为。


三元条件情况:

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

如果表达式的值为 time,则将其扩大double

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


简单赋值案例:

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


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

关于java - 包装器和自动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803947/

相关文章:

java - 使用 Tuple(double,int,int) 的数组列表比两个数组列表慢

java - 将 TimePicker 数据保存在 sqlite 数据库中

java - 如何从包中的类访问src中的类

java - 如何编辑此方法以使用 Customer 数组?

java - 重构排列发现

c++ - 当包含在另一个 vector 中时如何使用 vector 包装类?

linux - MATLAB Mex 套接字包装器库

c++ - 有什么方法可以访问 union 内部的 protected 声明?

java - 在 Java 中将 int(primitive) 转换为 Long(wrapper) 的最佳方法

java - 为什么自动装箱/拆箱在这里失败?