在处理缩小转换的JLS 5.2中,它说:
此外,如果该表达式是以下内容的常量表达式(第15.28节) 输入byte,short,char或int类型:
如果类型为 变量是byte,short或char,常量的值 表达式可以用变量的类型表示。 ...
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;
答案 0 :(得分:2)
因为在您的示例中,a*2
不是constant expression。
如果a
引用了constant variable,它将是一个常量表达式:
final byte a = 1;
byte b = a * 2; // compiles fine