Quando se declara as variaveis s1 e c1 com o modificador final, é possível adicioar em um tipo byte, como no exemplo abaixo.
final short s1 = 1;
final char c1 = 1;
byte b1 = s1;
byte b2 = c1;
Mas se for removido o modificador final, o código não compila.
Alguém poderia me explicar ?
final short s1 = 1;
final char c1 = 1;
byte b1 = s1;
byte b2 = c1;
Mas isto não compila:
final short s1 = 1234;
final char c1 = '\u1234';
byte b1 = s1;
byte b2 = c1;
A razão é que no primeiro trecho de código, o compilador sabe que o valor cabe exatamente em um byte (porque s1 e c1 são constantes). No segundo trecho de código, o valor não cabe em um byte, e não pode ser compilado.
Este código que eu adicionei acima, compila!!!
Se as duas primeiras variaveis locais estiverem marcados com “final”.
Se remover o modificador final dessas variaveis não compila.
Agora porque não compila que gostaria de saber, não consegui entender.
Existe essa possibilidade, mas o que estou querendo saber é outra coisa.
Isso não compila!!!
short s1 = 1;
char c1 = 1;
byte b1 = s1;
byte b2 = c1;
Se a variavel usada para atribuição for declarada como final(s1 e c1), é realizada uma conversão implicitamente, para b1 e b2, por isso funciona.
De fato, o compilador não é esperto suficientemente para determinar que entre “short s1 = 1” e “byte b1 = s1” o valor de s1 não varia (já que é uma variável local, não uma variável de instância que poderia ser modificada externamente por uma thread) e portanto poderia ser considerado igual a 1, ou seja, caberia em um byte.
Ele acha que, quando chega à linha “b1 = s1”, o valor de s1 pode ser qualquer, inclusive um que excede o tamanho de um byte.
Isso poderia ser resolvido com análise de fluxo, mas acho que, para não complicar mais ainda a definição da linguagem, resolveram rejeitar a conversão implícita neste caso.
so para completar… qdo vc poe final eh constante o valor nao sofre alteração… entao por isso compila… mais qdo vc tira é o que thingol falou acima… as palavras dele é a solução para a sua duvida heeh!!