2013-11-15 18 views
2
Float f = new Float(10.71);  
byte b = (byte)f; 

我得到为什么我需要在投射到字节之前投射浮点数来浮动?

Cannot cast from Float to byte 

为什么我必须这样做?

byte b = (byte)(float)f; 
+0

您正在将'Float'转换为'float'而不是'float'转换为'float',细微差别。 –

+0

微妙之处在于肤浅的语法。顺便说一句'Float'->'float'和'float'->'byte'都不是实际的投射:首先是拆箱,其次是缩小转换。 –

+0

@KevinDiTraglia是啊。我编辑过,因为标题有误导性。 –

回答

10

您不能将Object转换为原语。由于Java的自动装箱功能,您只能投射Floatfloat

这个“功能”被愤怒的开发者不断地攻击,但我想它是在这里呆向后兼容的原因。

我不喜欢它要么,但你必须学会​​适应它。只是,如果你可以因为当你尝试做计算与null值是不好笑不要使用Long S或Float秒。

+4

Autobox,推出。 –

+1

够正确。我还会补充说,除非你需要包装器,否则就使用原语。 – MadConan

+0

@MadConan确实。艰难的边际情况下,当Java不需要时,我会让Java自动/拆箱。 – Gamb

4

由于Float是一个“盒装”float,你不能直接施放它。然而,在你的情况,你不需要造型处理 - you can go directly to byte,就像这样:

byte b0 = f1.byteValue(); 

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

0

您不能将对象转换为基元。

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

+0

您可以使用“演员操作员”将“Float”转换为“float”。你不能做的事情是立即开箱并转换。 –

+0

这不是演员,马可。执行拆箱操作,而不是演员。 –

+0

在这个问题或答案中都没有涉及任何事情。因此,无论是“无法将对象转换为原语”这句话都是无关紧要的,因为您无法将“float”转换为“字节”,或者,如果我们接受较宽松的含义,则不正确,因为您*可以*将“cast”运算符应用于“Float”并获得一个“float”。 –

0

不完全是某些但不是你做

byte bo = f1.byteValue(); 
1

注意对类和原语之间的差异。

你将永远不会被允许CASY任何对象为原始。这些是不同的实体作为对象创建通过实例化,因此JVM将对象和基元视为不同的实体,而它们之间没有关系。

与原语类(整数,浮点数,...)用来包装这些原语,并提供一些操作方法。此外,这些类有一个特定的转换过程,允许然后返回它们要包装的原语。

只有这些对象

float myFloat = (float)f; 

一旦你的对象转换为浮动型,相当于

float myFloat = f.floatValue(); 

,你可以向后它转换为int(这将删除小数数字显然)。

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