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