Atribuições de Primitivos - Primitive Assignments

Olá pessoal.

Alguém pode me ajudar a entender o porquê de a linha 8 não compilar?
Estou estudando o 3o. capítulo sobre atribuições de primitivos do livro K&B.

[code]public class Atribuicoes {
public static void main(String[] args) {
byte a = 1; // 1 é tratado como int pelo compilador mas não dá erro
byte b = 1; // idem a linha acima

    // ao somar os dois bytes, o resultado é um int, e precisa de cast. porque? 
    // o compilador não deveria fazer o narrow?
	byte c = a + b; // <= erro de compilação
}

}
[/code]

Obrigado

porque a soma de dois tipos bytes irá gerar um tipo int, neste caso para compilar será necessário um cast explicito para um tipo byte.

olá adolfo_eloy,

vê se ajuda:

http://www.guj.com.br/posts/list/156916.java
http://www.guj.com.br/posts/list/214130.java

att,

[quote=felipe.sales]porque a soma de dois tipos bytes irá gerar um tipo int, neste caso para compilar será necessário um cast explicito para um tipo byte.

[/quote]

Então Felipe, mas o literal 1 também é um int. E para o literal o compilador não reclama…
Será que posso assumir que a regra é:

  • para literais a redução é feita de forma implícita
  • para referências para tipos “maiores” é necessário cast.

São coisas simples que usamos no dia a dia, mas fico preocupado considerando a prova. :slight_smile:

Então, adolfo_eloy…
O que acontece é o seguinte o inteiro 1 cabe em um tipo byte, mas se tivesse inserido o inteiro 400, por exemplo, daria o erro que vc tava esperando. No caso da soma é mais ou menos assim: a soma de qualquer tipo que seja menor que um int vai gerar um int.

eu tbm to estudando pra SCJP e essas coisas são traiçoeiras msm…

Quando é LITERAL o compilador tem a certeza do que está acontecendo…

byte b = 1 + 1; // = 2. cabe no byte, faz o cast implicito..
byte b2 = 1 + 127; // = 128, não cabe no byte, erro de compilação..

agora…

byte b = 1;
byte x = 1;
byte r = b + x;

não se tratam mais de literal e sim de VARIÁVEIS…
está fora do contexto do compilador…
ele não sabe e nem quer saber o que está dentro das variáveis… se é um literal, se é um resultado de uma consulta no bd…

o que ele sabe é que o resultado da soma de 2 bytes é um inteiro, como esse inteiro não é um literal, exige o cast explicito…

Espero ter ajudado…
[]s

Caros muito obrigado pela ajuda.

Só lendo o livro K&B isso não tinha ficado tão claro.

tks