Java中为什么无法将Object强制转换为Float?

22

为什么这样做是有效的:

 Object prova = 9.2;
 System.out.println(prova);
 Double prova2 = (Double) prova;
 System.out.println(prova2);

这个不行吗?

Object prova = 9.2;
System.out.println(prova);
Float prova2 = (Float) prova;
System.out.println(prova2);

因为这个问题我在我的Java Android应用程序中浪费了1个小时,所以我不得不将它转换成double,然后将double转换成float或者会有异常


1
如果您读取后者(我假设是ClassCastException)的异常文本,然后查看FloatDouble的继承层次结构,答案应该很明显。 - Anon
6个回答

20

你写的代码依赖于自动装箱特性,因此出现了问题。

Object prova = 9.2;

如果你想它是一个浮点数,尝试

Object prova = 9.2f;

请记住,java.lang.Float和java.lang.Double是兄弟类型; 共同类型是java.lang.Number

如果您希望以任何格式表示数字,请使用API,例如Number.floatValue()


17

因为prova是一个Double,而且Double不是Float的子类型。

你可以使用浮点字面量:9.2f(这样prova实际上将被解释为Float类型),或者你可以这样:

Float prova2 = ((Double) prova).floatValue();

15

9.2是一个双精度字面值。请尝试使用9.2f代替。

Object prova = 9.2f; // float literal is auto-boxed to a Float
System.out.println(prova);
Float prova2 = (Float) prova; // Float can be cast to Float, while Double cannot
System.out.println(prova2);

错误消息(你可能应该在问题中包含它)也很好地解释了:

Exception in thread "main" java.lang.ClassCastException: 
    java.lang.Double cannot be cast to java.lang.Float

您还可以通过添加 System.out.println(prova.getClass()); 来检查发生了什么。 - leonbloy

2

因为如果你不指定类型,它将会是一个双精度浮点数。如果你想要它成为单精度浮点数,你需要

Object prova = 9.2F;
System.out.println(prova);
Float prova2 = (Float) prova;
System.out.println(prova2);

0

尝试将它强制转换为Float而不是float 简单易懂


0

嗨,我也遇到了这个问题,花费了很长时间才想出这个非常简单的解决方案。 对于任何遇到此问题的人,您可能不想或无法更改接收到的对象,将对象值转换为替代方法是先将Double值转换为double变量类型。然后只需将double强制转换为float... 示例:

(我没有测试过,但是根据最初发布的问题进行了制作)

Object prova = 9.2;
System.out.println(prova);
double dblValProva = prova;
float pova2 = (float) dblValProva ;
System.out.println(prova2);

(这是我自己正在处理的一个示例,希望这些示例可以帮助其他人在未来)

JSONArray color // This is a JSON array containing 3 values... 
//for instance [ 0.501, 0.501, 0.0 ]
double r = (Double) color.get(0);
double g = (Double) color.get(1);
double b = (Double) color.get(2);
Color3f floorColor = new Color3f((float)r, (float)g, (float)b);

对我来说,以前当我尝试使用它时会出现错误:

Color3f((float)color.get(0), (float)color.get(1), (float)color.get(2))

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