Operadores de atribuição
Um operador de atribuição é um operador binário que modifica ou atribui a variável no lado esquerdo do operador, com o resultado do valor no lado direito da equação. O operador de atribuição mais simples é o '=', que você já viu:
int x = 1;
Esta declaração atribui a x o valor 1.
O Java promoverá automaticamente de tipos de dados menores para maiores, como vimos na seção anterior sobre operadores aritméticos, mas lançará uma exceção do compilador se detectar que você está tentando converter de tipos de dados maiores para menores.
Vamos voltar a alguns exemplos semelhantes ao que você viu no Capítulo 1 para mostrar como a promoção(cast) pode resolver esses problemas:
int x = 1.0; // DOES NOT COMPILE
short y = 1921222; // DOES NOT COMPILE
int z = 9f; // DOES NOT COMPILE
long t = 192301398193810323; // DOES NOT COMPILE
A primeira instrução não compila porque você está tentando atribuir um double 1.0 a um valor inteiro. Mesmo que o valor seja um inteiro matemático, adicionando 0, você está instruindo o compilador a tratá-lo como um double. A segunda instrução não compila porque o valor literal 1921222 está fora do intervalo de short e o compilador detecta isso. A terceira instrução não compila por causa do f adicionado ao final do número que instrui o compilador a tratar o número como valor de ponto flutuante. Finalmente, a última instrução não compila porque o Java interpreta o literal como um int e percebe que o valor é maior do que o permitido por int. O literal precisaria de um L depois da literal para ser considerado long.
Fundição dos valores primitivos
Podemos corrigir os exemplos na seção anterior, lançando os resultados para um tipo de dados menor. as primitivas de conversão são necessárias sempre que você estiver passando de um tipo de dados numéricos maior para um tipo de dados numéricos menor ou convertendo de um número de ponto flutuante para um valor integral.
int x = (int)1.0;
short y = (short)1921222; // Stored as 20678
int z = (int)9l;
long t = 192301398193810323L;
Estouro positivo e negativo
As expressões do exemplo anterior agora compilam, embora haja um custo. O segundo valor, 1,921,222, é muito grande para ser armazenado como um short, portanto ocorre um estouro numérico e ele se torna 20,678. Estouro é quando um número é tão grande que não caberá mais no tipo de dados, então o sistema “envolve” o próximo valor mais baixo e conta a partir daí. Há também um análogo estouro negativo, quando o número é muito baixo para caber no tipo de dados.
Isso está além do escopo do exame, mas é algo a ser cuidado em seu próprio código. Por exemplo, a seguinte declaração gera um número negativo:
System.out.print(2147483647+1); // -2147483648
Como 2147483647 é o valor int máximo, adicionar qualquer valor estritamente positivo a ele fará com que ele envolva o próximo número negativo.
Vamos voltar a um dos nossos exemplos anteriores por um momento:
short x = 10;
short y = 3;
short z = x * y; // DOES NOT COMPILE
Baseado em tudo que você aprendeu até agora, você pode entender porque a última linha desta declaração não compilará? Se você se lembrar, os valores short são automaticamente promovidos para int ao aplicar qualquer operador aritmético, com o valor resultante sendo do tipo int. Tentar definir uma variável short para uma int resulta em um erro do compilador, pois o Java pensa que você está tentando converter implicitamente de um tipo de dados maior para um menor.
Há momentos em que você pode querer substituir o comportamento padrão do compilador. Por exemplo, no exemplo anterior, sabemos que o resultado de 10 * 3 é 30, que pode facilmente caber em uma variável short. Se você precisar que o resultado seja short, você pode sobrescrever esse comportamento lançando o resultado da multiplicação:
short x = 10;
short y = 3;
short z = (short)(x * y);
Ao executar essa conversão explícita de um valor maior em um tipo de dados menor, você está instruindo o compilador a ignorar seu comportamento padrão. Em outras palavras, você está dizendo ao compilador que tomou medidas adicionais para evitar estouro positivo ou negativo. Também é possível que em seu aplicativo e cenário específico, estouro positivo ou negativo resultem em valores aceitáveis.