Revolta com conversões de primitivos

Só estudando para o SCJP para perceber que algumas coisas em java não são padronizadas.

Percebi isto testando o seguinte código:

		byte b1 = 10;
		byte b2 = 13;
		b1 = b1*b2;

Este código ocorrera um erro. Ok tudo bem a regra diz que qualquer operação efetuada entre números inteiros retornara um tipo int por PADRÃO. Neste caso com um tipo int ?32bits? resultado da operação de multiplicação b1 * b2 será maior que um byte ?8bits?. Neste caso tem que ter uma conversão explicita.

		b1 = (byte)(b1*b2);
	ou conversão automática
		b1 += b1*b3; //Apesar de não efetuar o mesmo resultado 
Já em float a estória de conversão de java me queima os neuronios.
		float f1 = 10.1F;
		float f2 = 3.2F;
		f1 = f1 * f2; // Ok
Não consigo engolir que a expressão f1 * f2 pode ser atribuído direto a uma variável float ?32bits? sem conversão explicita, sendo que diz a regra: Operações entre numero de ponto flutuante retornarão por PADRÃO tipo double ?64bits?.

Alguém poderia me dizer por que isto é valido em tipo float???

Se falei alguma coisa nada haver... me corrijam...

Boa tarde gulira, então a respeito da sua duvida posso dizer o seguinte:

Isso ta certo porque o java promove o resultado para o maior valor na expressão, como são dois floats ele converte pra float mesmo.

float f1 = 10.1F;
float f2 = 3.2F;
f1 = f1 * f2; // Ok

Quando fazemos assim:

float f1 = 10.1F;
double d = 3.2;
f1 = f1 * d; // erro

Dá erro, ele pede a conversao ou que vc joga o resultado em um double, porque você está multiplicando um float por um double, logo o java promove para o maior tipo existente.

no segundo caso ele vai pedir que faça

float f1 = 10.1F;
double d = 3.2;
f = (float)(f1 * d); 
ou
double resultado = f1 * d;

resulta no maior numero de bits ou seja a multiplicação terá o resultado como um tipo double, podendo fazer o cast para float.

Espero ter ajudado, caso esteja errado alguém me corrija POR FAVOR…

[]'s

Com o Float ele permite, porque todo ponto flutuante é por padrão um double, mas na declaração você está forçando que ele seja declarado como float.

10.1F
3.2F

Logo, a multiplicação e seu resultado é possível atribuir à um atributo float.