为什么在java中不能进行包装整数到浮点的转换
为什么包装浮点的类型转换在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,则强制转换将起作用,但它不起作用 当触发此所需行为
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。解决方案并不安全。