Float f = new Float(10.71);
byte b = (byte)f;
我得到了
Cannot cast from Float to byte
为什么我必须这样做?
byte b = (byte)(float)f;
答案 0 :(得分:10)
您无法将Object
转换为基元。由于java的自动装箱功能,您只能将Float
投射到float
。
这个“功能”正在被愤怒的开发者无休止地攻击,但我想这是出于向后兼容的原因而停留。
我也不喜欢它,但你必须学会忍受它。如果可以,请不要使用Long
或Float
s,因为当您尝试使用null
值进行计算时,这不是很有趣。
答案 1 :(得分:4)
由于Float
是“盒装”float
,因此您无法直接投放它。但是,在您的情况下,您根本不需要进行投射 - you can go directly to byte
,如下所示:
byte b0 = f1.byteValue();
以上是可能的,因为Float
是java.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();