为什么我需要在转换为byte之前将Float转换为float?

时间:2013-11-15 14:03:24

标签: java casting

Float f = new Float(10.71);    
byte b = (byte)f;

我得到了

Cannot cast from Float to byte

为什么我必须这样做?

byte b = (byte)(float)f;

5 个答案:

答案 0 :(得分:10)

您无法将Object转换为基元。由于java的自动装箱功能,您只能将Float投射到float

这个“功能”正在被愤怒的开发者无休止地攻击,但我想这是出于向后兼容的原因而停留。

我也不喜欢它,但你必须学会​​忍受它。如果可以,请不要使用LongFloat s,因为当您尝试使用null值进行计算时,这不是很有趣。

答案 1 :(得分:4)

由于Float是“盒装”float,因此您无法直接投放它。但是,在您的情况下,您根本不需要进行投射 - you can go directly to byte,如下所示:

byte b0 = f1.byteValue();

以上是可能的,因为Floatjava.lang.Number的子类,它提供byteValue()方法。

答案 2 :(得分:1)

注意类和基元之间的差异。

永远不会允许将任何对象遗留给基元。这些是不同的实体,因为对象创建通过实例化,因此JVM将对象和基元视为不同的实体而没有关系。

与基元相关的类(Integer,Float,...)用于包装这些基元并提供一些操作方法。此外,这个类有一个特定的强制转换过程,允许返回它们包装的原语。

仅适用于这些对象

float myFloat = (float)f;

相当于

float myFloat = f.floatValue();

将对象转换为float类型后,可以将其向后转换为int(显然会删除小数位)。

int myInt = (int)(float)f;
int mySameInt = (int)f.floatValue();     //same value than above

答案 3 :(得分:0)

您无法将对象强制转换为基元。

但是,您可以使用byteValue()类中的Number方法。

答案 4 :(得分:0)

不完全确定,但你做不到

byte bo = f1.byteValue();