输入促销Java

时间:2015-06-26 15:05:37

标签: java casting

我正在学习Java与Herbert Schildt的书:Java初学者指南。 在那本书中出现了这段代码:

// A promotion surprise!
class PromDemo{
    public static void main(String args[]){
        byte b;
        int i;
        b = 10;
        i = b * b;      // OK, no cast needed

        b = 10;
        b = (byte) (b * b);     // cast needed!!

        System.out.println("i and b: " + i + " " + b);
    }
}

我不明白为什么我必须在行中使用(byte):

b = (byte) (b * b);     // cast needed!!

b被定义为一个字节,b * b的结果是100,这是一个字节的正确值(-128 ... 127)。

谢谢。

2 个答案:

答案 0 :(得分:7)

JLS(5.6.2. Binary Numeric Promotion)给出了关于将数值类型与二元运算符组合的规则,例如乘法运算符(*):

  
      
  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double。
  •   
  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float。
  •   
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long。
  •   
  • 否则,两个操作数都将转换为int。
  •   

最后一点适用于您的情况,字节转换为整数然后相乘。

答案 1 :(得分:3)

在Java中,当您进行如下计算时,byte和short将始终提升为int:

sheet2

所以你实际上将一个整数乘以一个整数,它将返回一个整数。由于无法为字节分配整数,因此需要强制转换。

如果你想谷歌它(称为https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

,这称为“自动类型推广”