为什么不是最终的variables总是一个常量expression式?
在下面的代码中:
final int a; a=2; byte b=a; // error: possible loss of precision
为什么我得到这个错误? 是不是a
最终variables编译时间常量expression式,因此在赋值过程中隐式缩小到字节?
换句话说不是上面的代码等价于:
final int a=2; byte b=a;
编译器不是那么聪明。
我们可以看出,价值永远是2.但是,如果我们有这样的事情呢?
class ABC{ final int a; public ABC(){ if(Math.random() < .5){ a = 2; } else{ a = 12345; } byte b = a; } }
编译器不够聪明,不能告诉这两种情况,所以它会给你一个错误。
从JLS
一个空白的
final
是一个final
variables,它的声明缺less一个初始化器。常量variables是基本types或types
String
的final
variables,使用常量expression式进行初始化(第15.28节)。
你的variables
final int a;
是一个空白的final
variables。 它缺less一个初始化程序。 第二段不适用于它,因为它没有在声明初始化。 因此它不是一个持续的expression。
这也适用于领域。
由于最终variables可能会被延迟初始化,编译器无法确定它在case分支中有一个值。