O que significa conversão de tipos
Java é de tipagem estática: todo valor tem um tipo, e o compilador não deixa você misturar tipos incompatíveis silenciosamente. A conversão de tipos é a forma de converter um valor de um tipo para outro — às vezes o Java faz isso por você, e às vezes você precisa solicitar explicitamente.
Há duas direções. Ir de um tipo menor para um maior (um int para um double) é seguro e acontece automaticamente. Ir de um tipo maior para um menor (um double para um int) pode perder dados, então o Java obriga você a deixar isso explícito com uma conversão.
Ampliação: a conversão automática
Uma conversão de ampliação move um valor para um tipo com mais espaço. Nada pode ser perdido, então o Java faz isso por você sem uma conversão:
O int 7 se encaixa em um double e se torna 7.0. A ordem de ampliação para números é byte -> short -> int -> long -> float -> double; atribuir da esquerda para a direita ao longo dessa cadeia nunca precisa de conversão. É por isso que misturar tipos em operações aritméticas geralmente "simplesmente funciona" — o Java amplia primeiro o operando menor.
Redução: a conversão explícita
No outro sentido — uma conversão de redução — pode haver perda de dados, então o compilador recusa a menos que você coloque o tipo de destino entre parênteses na frente do valor:
(int) pi é a conversão. Repare no que ela faz: trunca em direção a zero, simplesmente descartando a parte decimal. 3.9 se torna 3, e -3.9 se torna -3. Ela não arredonda. Se você quer arredondar, essa é uma ferramenta diferente:
Esquecer que uma conversão trunca é um dos erros mais comuns entre iniciantes — se o seu número "arredondado" sai sempre um a menos, geralmente é por isso.
A armadilha da divisão inteira
Essa pegadinha pega todo mundo uma vez. Quando ambos os operandos são int, o operador / faz divisão inteira e descarta o resto — antes de qualquer atribuição a um double:
a / b é 7 / 2, calculado inteiramente com aritmética de int, o que dá 3. Ampliar para double depois apenas transforma 3 em 3.0 — o .5 já se foi. Converter um operando para double primeiro ((double) a / b) força toda a expressão para ponto flutuante, resultando no 3.5 que você queria. Você só precisa converter um lado; o Java amplia o outro para combinar.
Quando a redução estoura
Uma conversão não verifica se o valor cabe. Se não couber, os bits são simplesmente cortados e você obtém um resultado surpreendente — sem erro, sem aviso:
300 não cabe em um byte, então os bits altos são descartados e você obtém 44. Essa é uma perda de dados "silenciosa" — o programa roda bem e dá uma resposta errada. Só reduza quando tiver certeza de que o valor cabe no tipo menor.
Convertendo entre números e strings
Uma String é um objeto, não um número, então você não pode convertê-la com (int) — isso é um erro de compilação. A conversão usa métodos dedicados:
Para ir de texto para número, use Integer.parseInt / Double.parseDouble. Se a string não for um número válido (digamos "hello"), esses métodos lançam uma NumberFormatException. Para ir de um número para texto, use String.valueOf(n) ou simplesmente concatene com "" — porque n + "" força o int a virar uma String. Atenção à diferença entre "5" + 1 (que dá a string "51") e 5 + 1 (que dá 6); o + significa concatenação no momento em que uma String está envolvida.
Convertendo objetos
A conversão também se aplica a referências de objetos, não apenas a primitivos. Você pode converter uma referência para um tipo relacionado ao longo de uma cadeia de herança — ampliar para um tipo pai é automático, reduzir de volta exige uma conversão explícita e só é seguro se o objeto realmente for daquele tipo:
Object o = "hello";
String s = (String) o; // OK: o realmente aponta para uma String
Integer bad = (Integer) o; // compila, mas lança ClassCastException em tempo de execução
A segunda conversão compila, mas explode em tempo de execução com uma ClassCastException porque o objeto é uma String, não um Integer. Você verá isso direito quando chegar à herança e ao polimorfismo; por enquanto, basta saber que a sintaxe (Type) é a mesma ideia aplicada a objetos.
Próximo: if-else
A conversão permite remodelar valores; o próximo passo é fazer seu programa escolher entre caminhos com base nesses valores. A instrução if-else executa um bloco quando uma condição é verdadeira e outro quando é falsa — a base de toda decisão que seu código toma. Essa é a próxima página.
Perguntas frequentes
O que é conversão de tipos em Java?
Conversão de tipos é transformar um valor de um tipo de dado em outro. O Java faz automaticamente as pequenas conversões de "ampliação" (como de int para double), mas uma conversão de "redução" que poderia perder dados (como de double para int) exige uma conversão explícita: int n = (int) 3.9;.
Como converter um double para um int em Java?
Coloque o tipo de destino entre parênteses antes do valor: int n = (int) 3.9;. Isso trunca em direção a zero (descarta a parte decimal), então você obtém 3, não 4. Para arredondar, use Math.round(3.9), que retorna 4.
Como converter uma String para um int em Java?
Uma String não é um número, então você não pode convertê-la com (int). Use Integer.parseInt("42") para obter um int, ou Double.parseDouble("3.14") para um double. Se o texto não for um número válido, esses métodos lançam uma NumberFormatException.