variable sirve que parametros para modificador method clase java expression constants compile-time-constant narrowing

sirve - static int java



¿Por qué una variable final no es siempre una expresión constante? (3)

En el siguiente código:

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

¿Por qué me sale este error? ¿No es a variable final la expresión constante de tiempo de compilación y, por lo tanto, se reduce de forma implícita a byte durante la asignación?

En otras palabras, el código anterior no es equivalente a:

final int a=2; byte b=a;


Como las variables finales se pueden inicializar con retraso y el compilador no puede determinar para b que tiene un valor en la rama del caso.


Desde el JLS

Una final blanco es una variable final cuya declaración carece de un inicializador.

Una variable constante es una variable final de tipo primitivo o tipo String que se inicializa con una expresión constante (§15.28).

Su variable

final int a;

Es una variable final blanco . Carece de un inicializador. El segundo párrafo no se aplica a él porque no está inicializado en la declaración. Por lo tanto, no es una expresión constante.

Esto se aplica a los campos también.


El compilador no es tan inteligente.

Podemos decir que el valor siempre será 2. Pero, ¿y si tuviéramos algo como esto?

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

El compilador no es lo suficientemente inteligente como para distinguir estos dos casos, por lo que le da un error.