Variaveis final

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 ?

Não compila, e te retorna qual erro?

Isto compila:

 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.

Olha aqui a descrição do problema:

Acho que a resposta do seu problema está na post do thingol.

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.

qual é o modificador de acesso da classe?

só por curiosidade!

^^

public
Pq?

[quote=Heider Matos]Isso não compila!!!

short s1 = 1; char c1 = 1; byte b1 = s1; byte b2 = c1;
[/quote]

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!!