Casts Inesperados!? [RESOLVIDO]

4 respostas
lavreh
public class TypeCast {

	public static void main(String[] args){
	
		float x = 6.77f;
		
		int a = x + 2; // Erro de Compilação, atribuição de float aonde se esperava int
		
		int b = 2;
		b += x; // OK!? Igual a 8
		System.out.println(b);
	}
}

Salve, salve!

Numa operação entre operandos do tipo [i]float[/i] e [i]int[/i] é natural que tenhamos um [i]float[/i] como resultado. O qual não poderia ser atribuído a uma variável do tipo [i]int[/i]. Até aqui tudo dentro do esperado…
Mas o que me deixou com alguns cabelos brancos a mais é que a mesma operação realizada através do operador +=, misteriosamente é admitida pelo compilador e retorna o resultado correto! :shock:
Pelo meu entendimento, o compilador interpretou a expressão como [i]b = (int) (b + x)[/i]. É isso mesmo? Existe alguma explicação lógica?

4 Respostas

ErickRAR

Isso. No caso do “+=” o cast é implícito. Já no primeiro caso você tem que fazer o cast manualmente,

lavreh

ErikRAR, é exatamente essa “despadronização” que me deixou confuso.
É totalmente compreensível que um dado do tipo float não possa ser atribuído a uma variável int sem um cast explícito, já que há perda de precisão, como o próprio compilador alerta.
Mas por que ao utilizar o operador += esse cast passa a ser implícito? Na prática há alguma situação onde esse comportamento seja útil?
Não é que eu esteja criticando os engenheiros do Java, porém esta decisão de projeto não ficou muito clara pra mim… Talvez não deva ser mesmo, né?! :roll:

E

Isso é um comportamento herdado do C. É coisa do James Gosling ele ter deixado alguns comportamentos esquisitos do C no Java. Vá reclamar com ele…

Algumas coisas que foram herdadas do C:

  • O fato de janeiro ser o mês 0, não 1, em java.util.Calendar e java.util.Date
  • O operador “/” fazer divisão inteira quando ambos os operandos são inteiros e quebrar a perna de todos aqueles que acham que 2 / 3 = 0.6666666…
  • O case (do switch) exigir um break, senão ele “vaza” (fallthrough) para o próximo case
  • O double ser favorecido em relação ao float (no que eu concordo com o Gosling - float não deve ser usado para fazer contas).
lavreh

entanglement , reclamar com o Gosling?! :lol: Sou um mero usuário de tecnologia, há anos luz de um cidadão desse…

Irônico é que lembrei justamente da linguagem C, que por ter tipagem fraca acaba permitindo coisas assim.
Mas não sabia desta “herança” por parte do Java, achei que somente o C++ tivesse sido implementado sobre o C.

Muito interessante essa informação, facilita o entendimento de outras idiossincrasias do Java. Valeu!

Criado 3 de setembro de 2012
Ultima resposta 3 de set. de 2012
Respostas 4
Participantes 3