赋值上下文中的Java原始转换Long和int

时间:2013-12-17 10:43:09

标签: java

Long ll = 102; // Error
Byte bb = 101; // No error

为什么Long分配导致编译时错误而Byte分配正常?

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

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

3 个答案:

答案 0 :(得分:12)

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

将您的代码更改为long ll,这样就可以了。

java中没有byte基元的标记 - 在byte(-128到+127)的有效范围内输入的任何值都可以视为byteinteger取决于上下文。在这种情况下,它将其处理为byte,然后自动装箱就可以对其进行处理。

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

答案 1 :(得分:10)

请参阅5.1.7 Boxing Conversion of the JLS

  
      
  • 如果p是int类型的值,那么装箱转换将p转换为类的引用r并输入Integer,这样r.intValue()== p
  •   

因为102是一个整数字面值,所以它的类型为int,自动装箱会将其转换为Integer(如规范所述),但Integer不能被转换为Long

因此,当您使用long文字或将int文字强制转换为long时,JLS将使用装箱转换,结果将是Long个对象。< / p>

这没关系

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

第二个

Byte bb = 101;
由于5.2. Assignment Conversion

有效

  

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

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

所以101是一个整数文字,但有一个分配需要缩小转换(int - &gt; byte),int的值在byte值范围内范围。因此,它可以表示为变量类型(参见规范)并进行转换。

当然不工作

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

答案 2 :(得分:6)

  1. 自动拳击不施放;例如,它只会自动将long添加到Longint增加到Integer等等。
  2. 在Java中,数字文字本质上是int
  3. 因此,应该清楚为什么Long的分配不起作用:int正在尝试转换为long然后自动加框为Long一步到位......不要去。

    但是,-128127范围内的数字文字可能会在正确的上下文中被解释为byte文字,因此这就是Byte作业的原因。< / p>