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

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

我能理解

Cannot cast from Float to byte

为什么我必须做这件事?

byte b = (byte)(float)f;

你正在将 Float 强制转换为 float 而不是将 float 转换为 float,这是微妙的区别。 - Kevin DiTraglia
唯一微妙的差别就是表面句法。顺便说一下,Float->floatfloat->byte都不是实际的转换:前者是拆箱,后者是缩窄转换。 - Marko Topolnik
@KevinDiTraglia 是的。我修改了那个标题,因为它有误导性。 - Adam Arold
5个回答

11

你不能将一个Object强制转换为基本类型。你只能通过Java的自动装箱特性,将Float强制转换为float

这个“特性”一直受到开发者的无休止攻击,但我想它因向后兼容性而存在。

我也不喜欢它,但你必须学会与之共存。尽可能不要使用LongFloat,因为如果你试图使用null值进行计算,这是不好笑的。


1
足够正确。我还要补充一点,除非你需要包装器,否则只需使用基元。 - MadConan
@MadConan 的确。虽然很微小,但我会避免在不需要的情况下让 Java 自动装箱/拆箱。 - Fritz

4

由于Float是一个“装箱的”float,因此您无法直接进行强制转换。但在您的情况下,您根本不需要进行转换 - 您可以像这样直接使用byte

byte b0 = f1.byteValue();

上述情况是可能的,因为Floatjava.lang.Number的子类,而后者提供了byteValue()方法。

1
请注意类和原始类型之间的区别。
您永远不能将任何对象转换为原始类型。这些是不同的实体,因为对象创建通过实例化进行,因此JVM将对象和原始类型视为不同的实体,彼此之间没有关系。
与原始类型相关的类(Integer、Float等)用于包装这些原始类型并提供一些操作方法。此外,这些类具有特定的转换过程,允许它们返回其正在包装的原始类型。
仅适用于这些对象。
float myFloat = (float)f;

等同于

float myFloat = f.floatValue();

一旦你将对象转换为浮点类型,就可以将其向后转换为整数(这将显然删除小数位)。
int myInt = (int)(float)f;
int mySameInt = (int)f.floatValue();     //same value than above

0

不是很确定,但你不能这样做吗?

byte bo = f1.byteValue();

0

你无法将一个对象强制转换为原始类型。

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


你可以使用“强制转换运算符”将 Float 转换为 float。但你不能同时进行拆箱和转换。 - Marko Topolnik
那不是一个转换,Marko。执行的是拆箱操作,而不是转换。 - Silviu Burcea
这个问题和你的回答都没有涉及任何强制类型转换。因此,要么说“你不能将一个对象转换为原始类型”这个语句是无关紧要的,因为你也不能将float转换为byte,或者如果我们接受更宽松的含义,那么这个语句是不正确的,因为你可以Float应用“cast”运算符并得到一个float - Marko Topolnik
他没有得到这样的东西;他得到了一个编译器错误,并且错误消息在更宽松的意义上使用了“转换”一词(很可能是因为在严格的意义上该语句也是正确的)。 - Marko Topolnik

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