that's because the value of final variables are replaced with the value of the variable after compilation...
eg- final int x = 10; short s = x;
will look like this after compilation- final int x = 10; short s = 10;
but when you assign the value after declaration, the compiler is not able to determine the value of the variable x at compile time so it is not able to replace the value of the final variable with the name of the final variable everywhere the final variable is used.
so final int x; x = 10; short s = x;
after compilation would remain the same so it gives an error that an int is being assigned to a short....
Thanks Ankit! Help me understand though. Is it like both variables are declared first, and then x is given the value, so at the moment of declaration s doesn't know yet that x is 10, not 86245, so it's concerned about possible precision loss?