Java 为什么在转换为字节之前,我需要将浮点转换为浮点?

Java 为什么在转换为字节之前,我需要将浮点转换为浮点?,java,casting,Java,Casting,我明白了 我为什么要这么做 Cannot cast from Float to byte 不能将对象强制转换为基元。由于java的自动装箱特性,您只能将Float转换为Float 这个“特性”正被愤怒的开发人员无休止地攻击,但我想出于向后兼容性的原因,它会一直存在下去 我也不喜欢,但你必须学会接受它。如果可以,请不要使用Longs或Floats,因为当您尝试使用null值进行计算时,这并不好笑。因为Float是一个“装箱的”Float,所以不能直接强制转换它。然而,在你的情况下,你根本不需要施

我明白了

我为什么要这么做

Cannot cast from Float to byte

不能将
对象
强制转换为基元。由于java的自动装箱特性,您只能将
Float
转换为
Float

这个“特性”正被愤怒的开发人员无休止地攻击,但我想出于向后兼容性的原因,它会一直存在下去


我也不喜欢,但你必须学会接受它。如果可以,请不要使用
Long
s或
Float
s,因为当您尝试使用
null
值进行计算时,这并不好笑。

因为
Float
是一个“装箱的”
Float
,所以不能直接强制转换它。然而,在你的情况下,你根本不需要施法,比如:

byte b = (byte)(float)f;

之所以可以这样做,是因为
Float
是的子类,它提供了
byteValue()
方法。

不能将对象强制转换为基元


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

不完全确定,但您不能这样做

byte b0 = f1.byteValue();

注意类和原语之间的差异

永远不允许将任何对象强制转换为基本体。当对象创建通过实例化时,这些是不同的实体,因此JVM将对象和原语视为不同的实体,它们之间没有关系

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

仅适用于这些对象

byte bo = f1.byteValue();
相当于

float myFloat = (float)f;
一旦将对象转换为浮点类型,就可以将其向后转换为int(这将明显删除十进制数字)


没错。我还要补充一点,除非您需要包装器,否则只需使用原语即可。@MadConan确实如此。很难,我愿意让Java在不需要时自动/取消装箱。您正在将
Float
转换为
Float
而不是
Float
转换为
Float
,细微的区别。唯一细微的区别是表面的语法。顺便说一句,
Float
->
Float
Float
->
byte
实际上都不是强制转换:第一个是取消装箱,第二个是缩小转换。@KevinDiTraglia yea。我编辑它是因为标题有误导性。你可以使用“cast操作符”将
Float
解压到
Float
中。你不能做的事情是立即取消X和转换。那不是演员阵容,马尔科。解封操作是执行的,而不是强制转换。这个问题或你的答案都不涉及任何强制转换。因此,“您不能将对象强制转换为原语”的语句是不相关的,因为您不能将
浮点
强制转换为
字节
,或者,如果我们接受更宽松的含义,则是不正确的,因为您可以将“强制转换”运算符应用于
浮点
,并获得
浮点;他遇到了一个编译器错误,错误消息使用了松散意义上的术语“cast”(很可能是因为严格意义上的语句也是正确的)。
float myFloat = (float)f;
float myFloat = f.floatValue();
int myInt = (int)(float)f;
int mySameInt = (int)f.floatValue();     //same value than above