为什么不是最终的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是一个finalvariables,它的声明缺less一个初始化器。

常量variables是基本types或typesStringfinalvariables,使用常量expression式进行初始化(第15.28节)。

你的variables

 final int a; 

是一个空白的finalvariables。 它缺less一个初始化程序。 第二段不适用于它,因为它没有在声明初始化。 因此它不是一个持续的expression。

这也适用于领域。

由于最终variables可能会被延迟初始化,编译器无法确定它在case分支中有一个值。