Atribuições de Primitivos - Primitive Assignments

6 respostas
adolfo_eloy

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.

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

Obrigado

6 Respostas

F

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.

pedruhenrik

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,

adolfo_eloy

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.

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:

F

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…

D

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

adolfo_eloy

Caros muito obrigado pela ajuda.

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

tks

Criado 10 de novembro de 2010
Ultima resposta 10 de nov. de 2010
Respostas 6
Participantes 4