在Java推广?

i2i*_*eya 24 java

促销的规则是"当操作数具有不同类型时,自动二进制数字促销发生,较小的操作数类型转换为较大的".但操作数是相同类型的,例如,

byte=byte+byte // Compile time error... found int..
Run Code Online (Sandbox Code Playgroud)

那为什么会这样呢?

Jon*_*eet 47

没有+运算符byte.相反,两个操作数都被提升为int,所以你得到了

byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int 
Run Code Online (Sandbox Code Playgroud)

......然后失败,因为有一个从没有隐式转换intbyte.你需要施放:

byte a = 1;
byte b = 2;

byte c = (byte) (a + b);
Run Code Online (Sandbox Code Playgroud)

以下是数字推广的实际规则,来自JLS的5.6.2节:


当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则按顺序应用,使用扩展转换(第5.1.2节)根据需要转换操作数:

  • 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节).然后:
  • 如果任一操作数的类型为double,则另一个操作数转换为double.
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float.
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long.
  • 否则,两个操作数都将转换为int类型.

  • 谢谢乔恩,这就是我所期待的.但有一件事我不得不问,为什么字节没有+运算符? (4认同)

den*_*nov 17

您收到了关于自动升级到'int'的正确答案.

还有一点需要注意 - 复合赋值运算符的行为与它们具有隐式类型的情况相同.例:

byte b1 = 1;
byte b2 = 2;
b1 = b1 + b2; // compilation fails
b1 += b2; // compilation successful
Run Code Online (Sandbox Code Playgroud)