1. Conversión implícita (automática) de tipos
En Java (como en otros lenguajes), las variables tienen un tipo estricto: si una variable se declara como int, solo puede almacenar números enteros, y si se declara como double, solo números de coma flotante. Pero en programas reales a menudo surge la situación en la que hay que «traspasar» un valor de una variable a otra de distinto tipo. Por ejemplo:
- Recibimos de un método un int, pero queremos usarlo como double para cálculos con decimales.
- Guardamos el código de un carácter como número (int) y queremos obtener el propio carácter (char).
- Tenemos un resultado en double, pero necesitamos un entero (int), por ejemplo, para mostrar la cantidad de manzanas enteras.
En Java hay dos formas principales de conversión de tipos: implícita (automática) y explícita (manual).
¿Qué es?
La conversión implícita es cuando Java convierte por sí sola, «sin tu intervención», un valor de un tipo a otro, si esto es seguro y no provoca pérdida de datos.
Esto ocurre cuando asignas un valor de un tipo más pequeño a una variable de un tipo más grande. Por ejemplo, de int a double, de char a int, de float a double.
Analogía: imagina que tienes un vaso de agua (int) y un cubo (double). Si viertes el agua del vaso en el cubo — no se derrama nada, todo cabe. En estos casos, Java permite la conversión automática.
Ejemplo: int → double
int apples = 5;
double applesWeight = apples; // int se convierte automáticamente en double
System.out.println(applesWeight); // 5.0
Ejemplo: char → int
Cada carácter en Java es simplemente un número de la tabla Unicode. Por eso, la conversión de char a int ocurre automáticamente:
char letter = 'A';
int code = letter; // 'A' se convierte en 65 (código del carácter en Unicode)
System.out.println(code); // 65
Tabla de conversiones implícitas
| Origen | Se puede convertir implícitamente a |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Importante: La conversión implícita solo funciona en sentido de «ampliación» (de menor a mayor).
2. Conversión explícita (manual) de tipos (type casting)
La conversión explícita se requiere cuando quieres convertir un valor de un tipo mayor a uno menor o entre tipos incompatibles. En ese caso, Java exige que indiques explícitamente que eres consciente de la posible pérdida de datos.
Analogía: intentas verter agua de un cubo (double) a un vaso (int) — parte del agua puede derramarse, y Java te pide que digas: «¡Sí, entiendo que parte de los datos puede perderse!»
Sintaxis
tip_naznacheniya peremennaya = (tip_naznacheniya) vyrazhenie;
Ejemplo: double → int
double price = 12.99;
int roundedPrice = (int) price; // ¡la parte fraccionaria simplemente se descarta!
System.out.println(roundedPrice); // 12
Atención: ¡No hay redondeo! Simplemente se «corta» todo lo que sigue al punto decimal. Para redondear, usa Math.round().
Ejemplo: int → char
int code = 66;
char letter = (char) code; // 66 es el carácter 'B'
System.out.println(letter); // B
Ejemplo: double → float
double d = 3.1415926535;
float f = (float) d; // se pierde parte de la precisión
System.out.println(f); // 3.1415927 (menos cifras decimales)
3. Conversión entre números y caracteres (char y números)
¿Por qué es posible?
En Java, los caracteres (char) en realidad son solo números de la tabla Unicode. Por eso se pueden convertir libremente a int y viceversa.
Ejemplo: char → int
char ch = '\u0416';
int code = ch;
System.out.println(code); // 1046
Ejemplo: int → char
int code = 8364;
char symbol = (char) code;
System.out.println(symbol); // €
Práctica: imprimimos el alfabeto
for (int i = 65; i < 65 + 26; i++) {
System.out.print((char) i + " ");
}
// Imprimirá: A B C D ... Z
4. Conversión entre enteros y números en coma flotante
int → double (implícita)
int count = 10;
double avg = count; // ampliación implícita
System.out.println(avg); // 10.0
double → int (explícita)
double score = 8.75;
int rounded = (int) score;
System.out.println(rounded); // 8
¿Cómo redondear según las reglas matemáticas?
Si necesitas no solo «cortar» la parte decimal, sino redondear al entero más cercano, utiliza Math.round():
double price = 8.75;
int rounded = (int) Math.round(price);
System.out.println(rounded); // 9
5. ¿Qué ocurre al «reducir» el tipo? Pérdida de datos
Ejemplo: int → byte
int big = 300;
byte small = (byte) big;
System.out.println(small); // 44 (!)
¿Por qué 44? Porque byte almacena valores de -128 a 127, y si el número no cabe, ocurre un «recorte» módulo 256 (resto de la división).
Ejemplo: double → int
double d = 1e20;
int i = (int) d;
System.out.println(i); // -2147483648 (valor mínimo de int)
Un número grande no cabe en el rango de int, y el resultado se vuelve «extraño».
6. Conversión en cálculos: tipos «mixtos»
Ejemplo: int + double
int a = 3;
double b = 2.5;
double result = a + b; // int se convertirá automáticamente en double
System.out.println(result); // 5.5
Ejemplo: char + int
char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset); // char se convertirá automáticamente en int
System.out.println(next); // C
7. Conversión entre números y cadenas
Aunque esto no es exactamente «casting de tipos», a menudo surge la tarea de convertir un número en cadena y viceversa.
int → String
int x = 123;
String s = Integer.toString(x);
// o simplemente: String s = "" + x;
String → int
String s = "456";
int x = Integer.parseInt(s);
8. Errores típicos y matices
Error n.º 1: Pérdida de la parte decimal al convertir de double → int. Muy a menudo los principiantes piensan que (int) 3.99 dará 4. En realidad el resultado es 3, la parte fraccionaria simplemente se descarta. Para un redondeo correcto usa Math.round().
Error n.º 2: La «reducción» implícita no funciona. No puedes escribir sin más int x = 300; byte b = x; — el compilador producirá un error. Debes indicar explícitamente (byte) x, pero prepárate para resultados extraños si el número excede el rango de byte.
Error n.º 3: Conversión entre tipos incompatibles. No puedes escribir (int) "123" — una cadena debe convertirse a número mediante Integer.parseInt().
Error n.º 4: Problemas con char y int. La conversión de int a char solo funciona para valores que realmente existen en Unicode. Si pasas un número grande, el resultado será un carácter inesperado.
Error n.º 5: Tipos mixtos en expresiones. Si una expresión contiene int y double, el resultado será siempre double. Esto puede afectar inesperadamente a la lógica del programa si esperabas un número entero.
Error n.º 6: ¡Redondear no es conversión de tipo! (int) x no es redondear, sino simplemente descartar la parte decimal. Para redondear, usa Math.round().
GO TO FULL VERSION