En Java, cuando mezclamos tipos de datos en una expresión, el compilador debe asegurarse de que ambos operandos “hablen el mismo idioma”.
La regla base es esta:
✅ Java convierte automáticamente cuando NO hay pérdida de datos.
⚠️ Si hay posible pérdida, Java te obliga a hacerlo a mano (casting explícito).
Mira este ejemplo: short + int.
Salida: 3
short usa 2 bytesint usa 4 bytesComo un int puede guardar todo lo que cabe en un short, Java hace esto:
x a int (sin que lo veas)1 + 2yEsto se llama conversión implícita (o automática).
La conversión implícita ocurre hacia tipos “más grandes”:
byte → short → int → long → float → double
👉 Esto es seguro porque, en general, vas hacia un tipo con más capacidad (menos riesgo de perder info).
double + intSalida: 3.1
Aquí pasa esto:
x es double2 es int2 a double → 2.01.1 + 2.0 = 3.1✅ No hay pérdida, así que Java lo hace solo.
int como resultado?Si intentas esto:
Da error porque:
x + 2 produce un double (3.1)int NO puede guardar decimales sin perder informaciónJava no lo hace automáticamente.
Si de verdad no te importan los decimales, debes decirlo tú:
Salida: 3
📌 Paso a paso:
(int) x convierte 1.1 a 1 (se corta la parte decimal)1 + 2 = 3⚠️ Importante: casting a int NO redondea, solo trunca (corta).
Entre números sí podemos (porque son compatibles). Pero no podemos castear directamente una String a int:
String a número: parseIntCuando el dato viene como texto, usamos las clases contenedoras (wrappers).
Ejemplo con Integer.parseInt():
String a número: parseIntSalida: 3
📌 ¿Por qué esto es tan importante?
Porque en casi cualquier interfaz (web, móvil, escritorio), la entrada del usuario llega como texto (String). Así que necesitamos convertirla a número para poder sumar, restar, etc.
Si haces:
Eso lanza una excepción (Java te dice: “esto no es un int válido”). Luego veremos excepciones con calma.
Si el usuario escribe 1.1, entonces usamos Double.parseDouble():
Salida: 3.1
Cuando haces una operación como x + 2, Java decide el tipo del resultado así:
👉 El resultado queda del tipo “más grande” entre los operandos
(es decir, Java “sube” el más pequeño para que ambos queden iguales).
Recuerda la escalera:
byte → short → int → long → float → double
short + intx se “sube” a intintdouble + int2 se “sube” a double (2.0)doubledouble + int pero quiero int(int) x corta 1.1 → 1int⚠️ Nota: (int) no redondea, solo trunca.
En una expresión:
✅ Java convierte automáticamente hacia arriba (más grande) ⚠️ Para convertir hacia abajo (más pequeño), tú debes hacer casting.
Cuando mezclas tipos en una expresión, Java sube el más pequeño al más grande.
short + intdouble + int ¿Estás mezclando tipos en una expresión?
│
(sí)│
▼
¿El resultado cabe en el tipo de la izquierda
SIN perder información (sin pérdida)?
│
┌────────────┴────────────┐
│ │
(sí) (no)
│ │
▼ ▼
Conversión implícita Necesitas casting
(automática, Java lo hace) explícito (tú lo haces)
│ │
▼ ▼
byte→short→int→long→float→double (int) (short) ...
│ │
▼ ▼
✅ compila ⚠️ compila solo si casteasparse...()