在Java中为什么无法进行包装整数到浮点数的转换?

8
为什么在Java中使用包装浮点型进行类型转换无法作用于包装整型。
public class Conversion {
    public static void main(String[] args) {
        Integer i = 234;

        Float b = (Float)i;

        System.out.println(b);

    }
}
5个回答

17

Integer不是Float类型。对于对象,如果IntegerFloat的子类,则转换将起作用,但实际上并非如此。

当代码中唯一触发所需行为的是一个(Float)转换时,Java不会将Integer自动解包成int,再强制转换为float,然后自动装箱为Float

有趣的是,这似乎能够工作:

Float b = (float)i;

Java会自动将i拆箱成一个int,然后进行显式转换为float(一种扩展的基本类型转换,参见JLS 5.1.2),然后赋值转换会自动将其装箱为Float


如果i为null,这将产生NullPointerException。解决方案不安全。 - Réda Housni Alaoui
@RédaHousniAlaoui 在一般情况下,进行空值检查是一个好主意,但在这个问题中,i不是null - rgettman
我理解你的意思,但是我认为OP提供的代码仅仅是一个实验。我不认为他知道生产环境中i的值是多少。无论如何,这至少会对那些认为你的解决方案适用于任何情况的人是一个警示 :) - Réda Housni Alaoui

2

您正在要求它做太多的事情。您希望它将i拆箱,转换为浮点数,然后再装箱。编译器无法猜测拆箱i是否有帮助。但是,如果您用(float)替换(Float)进行转换,它将猜测需要先将i拆箱才能转换为浮点数,然后愉快地自动装箱为Float。


1

包装器存在的目的是将相关的基本类型“对象化”。这种类型的转换是在“对象级别”上完成的,而不是实际值的包装基本类型。

由于Float和Integer本身没有关系(它们与Number有关系,但它们只是兄弟关系),因此不能直接进行转换。


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

    Float b = i.floatValue();

    System.out.println(b);

}}

0
你可以重写你的类,让它按照你想要的方式工作:
public class Conversion {

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

}

如果i为null,这会产生NullPointerException。 这个解决方案不安全。 - Réda Housni Alaoui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接