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
finalblanco es una variablefinalcuya declaración carece de un inicializador.Una variable constante es una variable
finalde tipo primitivo o tipoStringque 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.