我写了一个程序。
class First
{
public static void main(String[] args)
{
int c = 5;
byte b = c+6;
System.out.println(b);
}
}
我的javac输出是:
error: incompatible types: possible lossy conversion from int to byte
byte b = c+6;
^
1 error
但如果我将程序修改为:
class First
{
public static void main(String[] args)
{
byte b = 5+6;
System.out.println(b);
}
}
执行正常,输出:
11
我知道在操作之前,两个操作数都以整数转换。然后+运算符产生一个整数。但是如果变量c是一个整数,那么常量5默认也是一个整数。为什么javac在第二种情况下不会导致错误?
如果我在概念上错了,请指导我。
答案 0 :(得分:3)
根据JLS的Section 5.2:
常量表达式的编译时缩小意味着代码如:
字节theAnswer = 42; 被允许。如果没有缩小,整数文字42的类型为int的事实意味着需要转换为字节:
byte theAwerwer =(byte)42; //允许施放但不是必需的
在JLS的Section 15.28中进一步定义了常量表达式。
由于表达式5+6
是一个适合byte
范围的常量表达式,因此它将在编译时自动缩小,而无需显式强制转换。另一方面,由于表达式c+6
不是常量表达式,因此它不会自动缩小,并且需要显式强制转换。