2013-12-17 35 views
20
Long ll = 102; // Error 
Byte bb = 101; // No error 

为什么Long分配导致编译时错误而Byte分配是好的?的Java在分配方面长期原始的转换和int

Long ll = 102导致编译器错误“类型不匹配:无法从int转换为长”。我假设编译器将扩​​大到102至long,然后框到Long。 但它没有发生。

但是Byte bb = 101;不产生编译器错误。在这里我猜,101被缩小到byte(非长整数常量),然后装箱到Byte。 当缩小没有问题时,扩大的问题是什么?

+0

顺便说一句'龙LL = 102L;'会的工作 – janos

+1

感谢。我知道更改代码以避免编译器错误,但我想了解编译器的行为。 – Lalith

+0

顺便说一句如果你可以使用基元,不要使用对象/包装,它们更简单,更快。 –

回答

11

5.1.7 Boxing Conversion of the JLS参见

  • 如果p int类型的值,然后装箱转换转换峰值到类的参考r和键入整数,使得R。的intValue()== p

因为102是一个整数文字,它的类型是int和经销商的拳击将其转换为Integer(作为规范说),而是一个Integer不能被强制转换为Long

因此,当您使用long文字或铸int字面来long的JLS将使用装箱转换,结果将是一个Long对象。

这将是细

Long long1 = (long) 102; 
Long long2 = 102L; 
Long long3 = 102l; 

第二个

Byte bb = 101; 

作品因为5.2. Assignment Conversion

此外,如果表达式是一个常量表达式(§15.28 )类型字节,短,字符或int:

  • 如果变量的类型是byte,short或char,并且常量表达式的值可用变量的类型表示,则可以使用缩小基元转换。

所以101是一个整数文字,但存在需要收缩转换的分配(INT - >字节)和int的值是byte值范围内。因此它可以表示为变量类型(见规格)并转换。

这将NOT WORK当然

Byte bb = 128; // can not be represented as the variable type. Thus no narrowing conversion. 
+0

自动装箱会将其转换为Integer(如规范所述),但Integer不能被转换为Long。那么如何将Integer分配给字节(Byte bb = 101工作正常)? – Lalith

+0

@ user3110711我更新了我的答案。希望现在更清楚。 –

+0

不具说服力。字节bb = 128;由于超出范围的值而不起作用。但是,当范围内的值被给定时,缩小正在工作,但是扩大不起作用。这是什么原因呢。 – Lalith

12

发生这种情况是因为您使用的是Long而不是long。 Java自动装箱将不会同时从int转换为long,然后在同一步骤中将自动装箱long转换为Long

将您的代码更改为long ll,它将起作用。

有没有在java标记为byte基元 - 在有效范围内输入了byte(-128〜127)的任何值可以被视为或者是byteinteger取决于上下文。在这种情况下,它会将其处理为byte,然后自动装箱功能可以对其进行处理。

我不确定为什么决定让Java以这种方式工作。似乎字节处理与所有其他数字类型不一致。

+0

谢谢。但是,为什么字节分配不会导致错误? – Lalith

+0

我已添加编辑来覆盖此.. –

+0

谢谢。这看起来很合理。所以,虽然拳击文字是根据目标类型解释的。 – Lalith

6
  1. 自动拳击不演员;例如,它只会自动框中longLong,一个intInteger
  2. 在Java中的数字文字本身int

因此,应该清楚为什么分配Long不会工作:一个int正试图被投到一个long然后自动装箱到一步Long ...不行。

然而,在范围数字文字-128127可以解释为在正确的上下文byte文字,所以这就是为什么分配给Byte作品。

+0

谢谢。这看起来很合理。所以,虽然拳击文字是根据目标类型解释的。 – Lalith