public static void main(String[] args) {
final int a =15;
byte b = a;
System.out.println(a);
System.out.println(b);
}
在上面的代码中,当我从int转换为byte时,它没有给出编译时错误,但是当我的转换从long转换为int时,它给出了编译时错误,为什么?
public static void main(String[] args) {
final long a =15;
int b = a;
System.out.println(a);
System.out.println(b);
}
答案 0 :(得分:11)
来自the JLS section on assignment conversions:
此外,如果表达式是
byte
,short
,char
或int
类型的常量表达式:
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
当您声明并初始化final a
那个编译时常量表达式时,编译器可以确定值15
将安全地适合{{1} 1}}。 JLS根本不允许从byte
隐式缩小转换,没有解释,这个规则至少可以回到Java 2(我可以在任何地方找到的最早的JLS)。
我推测这个基本原理可能源于这样一个事实,即Java字节码是针对32位字大小定义的,而long
上的操作在逻辑上更加复杂和昂贵。