为什么在java中不能进行包装整数到浮点的转换

为什么在java中不能进行包装整数到浮点的转换,java,type-conversion,wrapper,Java,Type Conversion,Wrapper,为什么包装浮点的类型转换在java中不适用于包装整数类型 public class Conversion { public static void main(String[] args) { Integer i = 234; Float b = (Float)i; System.out.println(b); } } 整数不是浮点。对于对象,如果Integer子类Float,则强制转换将起作用,但它不起作用 当触发此所需行为

为什么包装浮点的类型转换在java中不适用于包装整数类型

public class Conversion {
    public static void main(String[] args) {
        Integer i = 234;

        Float b = (Float)i;

        System.out.println(b);

    }
}

整数
不是
浮点
。对于对象,如果
Integer
子类
Float
,则强制转换将起作用,但它不起作用

当触发此所需行为的唯一代码是
(float)
强制转换时,Java不会将
整数
自动取消装箱为
整数
,强制转换为
浮点
,然后自动装箱为
浮点

有趣的是,这似乎有效:

Float b = (float)i;

Java将自动将
i
解压为
int
,然后显式转换为
float
(a),然后赋值转换自动将其装箱为
float

您要求它做的太多了。您希望它取消装箱,将其转换为浮动,然后装箱。编译器猜不出拆箱对它有帮助。但是,如果您将(Float)cast替换为(Float)cast,它会猜测我需要解除绑定才能被转换为Float,然后很高兴地将其自动装箱为Float。

包装器用于“对象化”相关的基本类型。这种类型的转换是在“对象级别”上进行的,目的是以某种方式将其放置,而不是包装的基本类型的实际值


由于
Float
Integer
本身没有关系(它们与
Number
相关,但它们只是兄弟姐妹),所以不能直接执行强制转换。

您可以重写您的类,使其按照您的意愿工作:

public class Conversion {
public static void main(String[] args) {
    Integer i = 234;

    Float b = i.floatValue();

    System.out.println(b);

}}
public class Conversion {

     public Float intToFloat(Integer i) {
          return (Float) i.floatValue();
     }

}

如果i为null,则会生成NullPointerException。解决方案不安全。@RédaHousniAlaoui虽然空值检查通常是个好主意,但在这个问题上,
i
不是
null
。我明白你的意思,但我认为OP提供的代码只是一个实验。我认为他不知道I在生产环境中的价值。无论如何,至少对那些认为您的解决方案适用于所有地方的人来说,这是一个警告:)如果我为null,这将产生一个NullPointerException。解决方案并不安全。