Why isn't a final variable always a constant expression?

前端 未结 3 1501
后悔当初
后悔当初 2020-12-29 17:57

In the below code:

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

Why do I get this error? Isn\'t a final

相关标签:
3条回答
  • 2020-12-29 18:45

    From the JLS

    A blank final is a final variable whose declaration lacks an initializer.

    A constant variable is a final variable of primitive type or type String that is initialized with a constant expression (§15.28).

    Your variable

    final int a;
    

    is a blank final variable. It lacks an initializer. The second paragraph doesn't apply to it because it is not initialized at declaration. It therefore isn't a constant expression.

    This applies to fields as well.

    0 讨论(0)
  • 2020-12-29 18:57

    As final variables can be delayed initialized and the compiler cannot determine for b that it has a value in the case branch.

    0 讨论(0)
  • 2020-12-29 18:59

    The compiler isn't that smart.

    We can tell that the value will always be 2. But what if we had something like this?

    class ABC{
        final int a;
    
        public ABC(){
           if(Math.random() < .5){
              a = 2;
           }
           else{
              a = 12345;
           }
    
           byte b = a;
        }
    }
    

    The compiler is not smart enough to tell these two cases apart, so it gives you an error instead.

    0 讨论(0)
提交回复
热议问题