在Java中为浮点包装器分配整数值

在Java中为浮点包装器分配整数值,java,boxing,Java,Boxing,以下作品 float a=3; 但以下情况并非如此: Float a=3; 3不应该自动升级为浮点型(因为加宽转换不需要显式转换),然后装箱为浮点型吗 这是因为我在Khalid Mogul的Java书中读到了一条规则吗 无法遵循加宽转换 通过任何拳击转换 Float a=3的原因不起作用是因为编译器将3包装到它的整数对象中(本质上,编译器是这样做的:Float a=new Integer(3);这已经是一个编译器错误)。浮点对象不是整数对象(即使它们来自同一个Number对象) 以下工作:

以下作品

float a=3;
但以下情况并非如此:

Float a=3;
3不应该自动升级为浮点型(因为加宽转换不需要显式转换),然后装箱为浮点型吗

这是因为我在Khalid Mogul的Java书中读到了一条规则吗

无法遵循加宽转换 通过任何拳击转换


Float a=3的原因不起作用是因为编译器将
3
包装到它的整数对象中(本质上,编译器是这样做的:
Float a=new Integer(3);
这已经是一个编译器错误)。浮点对象不是整数对象(即使它们来自同一个
Number
对象)

以下工作:

Number a = 3;
本质上,编译器将其翻译为:

Number a = new Integer(3);
或者正如约阿希姆·绍尔所提到的

Number a = Integer.valueOf(3);
希望这有帮助。

Float Integer
Float               Integer
  ^                    ^
  |                    |
  |                    |
  v                    v
float <----------->   int
^ ^ | | | | v v 浮点整数

原语和包装器之间存在装箱/拆箱转换,并且存在从一个数字原语到另一个数字原语的升级。但是Java不能进行两次这种转换(在您的例子中,从int转换为Float)。

Float a=3.0f;将起作用。

实际上,自动装箱相当于
整数。valueOf(3)
而不是
新整数(3)
。区别在于前者对公共值进行了一些缓存。谢谢。3被转换为整数。valueOf(3)但是当我们将3转换为(Float)3时会发生什么?现在调用的是Float.valueOf(3)吗?@Daud,不是……自动装箱是由编译器完成的,因此本质上,编译器将执行以下操作:
Float a=(Float)Integer.valueOf(3)这仍然是一个错误。很好。我这样做是为了鼓励回复者在发布之前先证明他们的答案。这给那些阅读你答案的人一种解脱感。