为什么最终变量始终不是常量表达式?

时间:2015-06-11 15:33:56

标签: java expression constants compile-time-constant narrowing

在下面的代码中:

final int a;
a=2;
byte b=a;   // error: possible loss of precision

为什么会出现此错误? Isn' t a最终变量编译时常量表达式因此在赋值期间隐式缩小为字节?

换句话说,上述代码并不等同于:

final int a=2;
byte b=a;

3 个答案:

答案 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分支中具有值。

相关问题