Nesta questão ocorre um erro de compilação na linha 7, quando tenta-se atribuir um tipo long a um tipo byte.
Dùvida:
Entendo que um long tem 64 bits e um byte tem 8 bits, logo ocorre o erro.
Porém não entendo por que não ocorre o mesmo erro no caso da linha 4, onde está se atribuindo um valor short a um tipo byte, visto que o short tem 16 bits???
vc digitou errado ou a linha sete é assim mesmo, se for é por causa do | que ela não compila…
jordy
Se você tirar o modificador final da linha 1, dá erro de compilação na linha 4.
Fabricio_Cozer_Marti
unh … naum entendi tb naum!
será que existe algum limite de bits para o compilador acusar erro de precisão?
será que isso só acontece quando tentar fazer um cast implicito para long??
alterei a linha :
final long l1 = 1 // 2
para:
final int l1 = 1 // 2
e o compilador naum reclamou ???
alguem explica?
Canhoto ? Vc sabe essa modernidade?
danieldestro
Como as três primeiras são FINAIS, o valor não vai mudar mais. Então o compilador sabe qual o valor daqueles identificadores. Como eles são valores menores do que o limite máximo de cada outro tipo abaixo, ele funciona.
É o mesmo caso de:
byte b = 1;
1 é inteiro (int), mas está abaixo de 127 (limite de byte).
Imagine que chato seria fazer:
byte b = (byte) 1;
Fabricio_Cozer_Marti
certo,
mas na linha 2
final long l1 = 1; // 2
o valor de l1=1 é suportado por um byte não eh?
e porque então ele deu erro de compilação?
pela lógica achava que não deveria dar…
entendeu a dúvida?
D
Dharis
Tentando entender o fato, encontrei na Especificação da Linguagem Java o seguinte:
5.2 Assignment Conversion
Assignment conversion occurs when the value of an expression is assigned to a variable. (…) a narrowing primitive conversion may be used if all of the following conditions are satisfied:
The expression is a constant expression of type byte, short, char or int.
The type of the variable is byte, short, or char.
The value of the expression (which is known at compile time, because it is a constant expression) is representable in the type of the variable.
If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.
Nesse caso, eu posso fazer uma “conversão redutiva” na atribuição se a expressão atribuida for uma constante byte, short, char ou int.
Variaveis finais são tratadas como constantes.
Mas deve ser observado, que ser eu tivesse
ocorreria erro de compilação em (condição 3):
danieldestro
1 é uma literal do tipo int, 32 bits. long são 64 bits.
Então um long recebe 1 numa boa.
É o tal do widenning e narrowing.