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
。
当缩小没有问题时,扩大有什么问题?
答案 0 :(得分:12)
这种情况正在发生,因为您使用的是Long
而不是long
。 Java自动装箱不会在同一步骤中从int
转换为long
,然后再将自动装箱long
转换为Long
。
将您的代码更改为long ll
,这样就可以了。
java中没有byte
基元的标记 - 在byte
(-128到+127)的有效范围内输入的任何值都可以视为byte
或integer
取决于上下文。在这种情况下,它将其处理为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)
long
添加到Long
,int
增加到Integer
等等。int
因此,应该清楚为什么Long
的分配不起作用:int
正在尝试转换为long
然后自动加框为Long
一步到位......不要去。
但是,-128
到127
范围内的数字文字可能会在正确的上下文中被解释为byte
文字,因此这就是Byte
作业的原因。< / p>