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 variablefinal
cuya declaración carece de un inicializador.Una variable constante es una variable
final
de tipo primitivo o tipoString
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.