没有用于算术赋值的隐式转换?

时间:2019-03-15 02:28:41

标签: java implicit-conversion

在处理缩小转换的JLS 5.2中,它说:

  

此外,如果该表达式是以下内容的常量表达式(第15.28节)   输入byte,short,char或int类型:

     

如果类型为   变量是byte,short或char,常量的值   表达式可以用变量的类型表示。 ...

"In other words, for the non-long integer-like values, you can implicitly narrow them iff the value you're narrowing is a constant that fits within the type you're specifying."

  byte a = 1; // declare a byte
  a = a*2; //  you will get error here

在第一条语句中,将字节范围内的整数1分配给字节a,并进行隐式转换。

在第二条语句中,值1的字节a乘以整数2。由于Java中的运算规则,值1的字节a转换为值1的整数。将这两个整数(1 * 2)相乘的结果是整数2。

为什么第二个语句中没有隐式转换而导致错误?

Main.java:14: error: incompatible types: possible lossy conversion from int to byte
  a = a*2; 

1 个答案:

答案 0 :(得分:2)

因为在您的示例中,a*2不是constant expression

如果a引用了constant variable,它将是一个常量表达式:

final byte a = 1;
byte b = a * 2; // compiles fine