包装类 - 为什么整数文字因Long而失败,但适用于任何较小的文本

时间:2013-01-20 14:43:03

标签: java wrapper autoboxing

只是想了解自动拳击,我做了一件事:

Short s = 250;
Long l = 250;

Long l的分配失败。我希望这是因为你不能加宽那个盒子(即它试图将int250加宽到long,然后将它打包成它不能做的事。)

但是,对Short s的分配有效。怎么回事呢?我的假设是它还在做拳击和某种转换。但如果知道250符合short的情况,为什么它不知道250会适合long

2 个答案:

答案 0 :(得分:12)

通常情况下,您无法在作业中应用多个(隐式)转化(JLS §5.2 Assignment Conversion):

  

当表达式的值被赋值(第15.26节)给变量时,就会发生赋值转换:必须将表达式的类型转换为变量的类型。分配上下文允许使用以下之一

     
      
  • 身份转换(第5.1.1节)
  •   
  • 扩大原始转换(第5.1.2节)
  •   
  • 扩大参考转换(第5.1.5节)
  •   
  • 拳击转换(第5.1.7节),可选地后跟加宽引用转换
  •   
  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换。
  •   

Long l=250;需要两次转换(扩展原始转换,然后进行装箱转换),这就是它无法编译的原因。

Long l=250l;编译,因为它需要一次拳击转换。

但缩小常量表达式的转换是一种特殊情况,这就是Short s=250;编译的原因:

  

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

     
      
  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
  •   
  • 如果变量的类型是:则可以使用缩小的基元转换,然后使用装箱转换:      
        
    • 字节和常量表达式的值可以在字节类型中表示。
    •   
    • 简短,常量表达式的值可在short类型中表示。
    •   
    • 字符和常量表达式的值可在char。
    • 类型中表示   
  •   

答案 1 :(得分:0)

理想情况下,不应允许自动缩小。

但由于没有字节/短文字,我们无法写

byte b = 0b;

来说似乎很愚蠢
byte b = (byte)0;

允许自动缩小常量整数,以便我们编写

byte b = 0;

转移到自动装箱。

对于long / Long,因为有很长的文字,所以这不是一个问题。不过,应该允许它,因为自动加宽有符号整数总是安全的。