需要在Byte和Short中进行铸造

时间:2013-09-07 16:01:26

标签: java casting

Byte byte1=new Byte((byte) 20);
Short short1=new Short((short) 20);

为什么我必须在Byte和Short中使用强制转换运算符,但我没有在其他DataType中使用强制转换运算符

Integer integer=new Integer(20);
Long long1=new Long(20);
Double double1=new Double(20);
Float float1=new Float(20);

5 个答案:

答案 0 :(得分:9)

这是因为第二个代码段导致根据JLS §5.1.2扩大原始转化次数:

  

对原始类型的19个特定转换称为扩展原语转换:

     
      
  • byteshortintlongfloatdouble

  •   
  • shortintlongfloatdouble

  •   
  • charintlongfloatdouble

  •   
  • intlongfloatdouble

  •   
  • longfloatdouble

  •   
  • floatdouble

  •   

而第一个没有;请注意,没有从int转换为shortbyte

答案 1 :(得分:2)

文字“20”由编译器处理为 int 整数 Float Double 可以处理大于或等于 int 所以编译器可以进行implizit强制转换。 字节确实具有较小的范围,可防止implizit强制转换。如果 Byte Short 无法表示该数字,则可能会导致 ClassCastException

答案 2 :(得分:1)

Byte的构造函数需要byte,如果您正在构建它,Short的构造函数也是如此。

没有演员表或类型文字的数字总是被视为int

答案 3 :(得分:0)

byte的构造函数定义为

 public Byte(byte value) {
        this.value = value;
    }

它需要byte,因为你传递的是你需要显式转换的整数,同样适用于短

答案 4 :(得分:0)

Byte byte1=new Byte((byte) 20);
  

字节数据类型是8位带符号的二进制补码整数。它有   最小值为-128,最大值为127(含)。

但是,上面的20是一个整数。

  

int数据类型是32位带符号的二进制补码整数。它有   最小值-2,147,483,648,最大值2,147,483,647   (含)。

因此, byte 不能取出范围之外的任何值。当您尝试分配一个整数说 130 而不是 20 时,您将丢失数据(位),因为 130 超出字节范围。通过强制转换,您告诉编译器您已了解转换。