在下面的代码中:
final int a;
a=2;
byte b=a; // error: possible loss of precision
为什么会出现此错误? Isn' t a
最终变量编译时常量表达式因此在赋值期间隐式缩小为字节?
换句话说,上述代码并不等同于:
final int a=2;
byte b=a;
答案 0 :(得分:49)
来自JLS
空白
final
是final
变量,其声明缺少初始值设定项。常量变量是基本类型或类型的
final
变量String
用常量表达式初始化(§15.28)。
您的变量
final int a;
是空白final
变量。它缺少初始化程序。第二段不适用于它,因为它未在声明时初始化。因此,它不是一个恒定的表达。
这也适用于字段。
答案 1 :(得分:40)
编译器并不那么聪明。
我们可以判断价值总是为2.但是如果我们有这样的话怎么办?
class ABC{
final int a;
public ABC(){
if(Math.random() < .5){
a = 2;
}
else{
a = 12345;
}
byte b = a;
}
}
编译器不够聪明,不能将这两种情况区分开来,所以它会给你一个错误。
答案 2 :(得分:2)
由于最终变量可以被延迟初始化,并且编译器无法确定b它在case分支中具有值。