Conversiones de tipos en la práctica
Aplique conversiones de tipos en situaciones reales, incluidos cálculos numéricos y jerarquías de POO.
Conversiones de tipos en la práctica es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Conversión de tipos en la práctica
La conversión de tipos se utiliza constantemente en código Java real: en cálculos numéricos, jerarquías de POO, colecciones genéricas y API heredadas. Esta lección abarca patrones prácticos y posibles problemas.
Upcast: polimorfismo
Un upcast convierte un subtipo en un supertipo. Siempre es seguro e implícito: no se necesita ningún operador de conversión. Esto permite utilizar el polimorfismo.
class Payment {}
class CreditCardPayment extends Payment {
public void authorizeCard() {}
}
CreditCardPayment cc = new CreditCardPayment();
Payment p = cc; // implicit upcast — always safe
// p.authorizeCard(); // Compile error — Payment doesn't have this method
// need downcast to access subclass methodsDowncast: acceso a miembros del subtipo
Un downcast convierte una referencia a un supertipo de nuevo en el subtipo original. Requiere una conversión explícita y lanza ClassCastException si el objeto no es realmente una instancia de ese subtipo.
Payment p = new CreditCardPayment();
// Downcast to access CreditCardPayment-specific method
if (p instanceof CreditCardPayment cc) {
cc.authorizeCard(); // safe with pattern matching
System.out.println("Card authorized");
}
// Unsafe downcast without check:
try {
BankTransfer bt = (BankTransfer) p; // ClassCastException!
} catch (ClassCastException e) {
System.out.println("Wrong type!");
}Conversión numérica en cálculos
La división de enteros trunca el resultado. Convierta a double antes de dividir para obtener un resultado preciso. Este es uno de los errores aritméticos más habituales en Java.
int totalRevenue = 1000;
int months = 3;
// Integer division — truncates!
double wrong = totalRevenue / months;
System.out.println(wrong); // 333.0 (not 333.33)
// Correct: cast one operand to double first
double correct = (double) totalRevenue / months;
System.out.println(correct); // 333.3333333333333Conversión en colecciones (antes de los genéricos)
El código heredado suele almacenar objetos en colecciones sin tipos parametrizados. Es necesario realizar un downcast para recuperar valores tipados; compruebe siempre primero con instanceof.
import java.util.*;
// Legacy raw list (pre-Java 5 style)
List legacyList = new ArrayList();
legacyList.add("Alice");
legacyList.add(42);
for (Object item : legacyList) {
if (item instanceof String s) {
System.out.println("Name: " + s.toUpperCase());
} else if (item instanceof Integer n) {
System.out.println("Score: " + (n * 2));
}
}Conversión con interfaces
Un objeto puede convertirse a cualquier interfaz que implemente, lo que permite utilizarlo en contextos que requieren dicha interfaz.
interface Printable { void print(); }
interface Saveable { void save(); }
class Report implements Printable, Saveable {
public void print() { System.out.println("Printing report"); }
public void save() { System.out.println("Saving report"); }
}
Object obj = new Report();
if (obj instanceof Printable p) p.print();
if (obj instanceof Saveable s) s.save();Conversión con arrays
Los tipos de array forman su propia jerarquía. Un String[] es un subtipo de Object[]. La conversión de arrays sigue las mismas reglas que la de objetos.
String[] names = {"Alice", "Bob"};
Object[] objs = names; // upcast — implicit
objs[0] = "Charlie"; // OK — still a String
try {
objs[0] = 42; // ArrayStoreException at runtime!
} catch (ArrayStoreException e) {
System.out.println("Cannot store Integer in String[]");
}
// Downcast back
String[] restored = (String[]) objs;Ejemplo de comercio electrónico: selección del medio de pago
Un ejemplo real consiste en seleccionar el procesador de pagos adecuado según el tipo del pago en tiempo de ejecución.
interface Payment { double amount(); }
record CreditCard(String last4, double amount) implements Payment {}
record CryptoPayment(String wallet, double amount) implements Payment {}
record BankWire(String iban, double amount) implements Payment {}
static void process(Payment p) {
switch (p) {
case CreditCard cc -> System.out.println("Charging card *" + cc.last4());
case CryptoPayment cp -> System.out.println("Sending to wallet " + cp.wallet());
case BankWire bw -> System.out.println("Wiring to IBAN " + bw.iban());
}
}
process(new CreditCard("4242", 99.99));
process(new CryptoPayment("0xABCD", 0.05));Conversión a Number para operaciones matemáticas genéricas
La superclase Number permite realizar operaciones numéricas genéricas con cualquier tipo numérico mediante un upcast a Number y la llamada a doubleValue().
import java.util.List;
List<Number> numbers = List.of(1, 2.5, 3L, 4.0f);
double sum = 0;
for (Number n : numbers) {
sum += n.doubleValue(); // works for int, double, long, float
}
System.out.printf("Sum: %.1f%n", sum); // 10.5Método de utilidad para conversiones seguras
Un método de utilidad reutilizable que devuelve un Optional vacío en lugar de lanzar una excepción cuando la conversión no es válida; resulta ideal para código basado en pipelines.
import java.util.Optional;
public static <T> Optional<T> safeCast(Object obj, Class<T> clazz) {
return clazz.isInstance(obj)
? Optional.of(clazz.cast(obj))
: Optional.empty();
}
// Usage
Object val = "hello";
safeCast(val, String.class)
.ifPresent(s -> System.out.println(s.toUpperCase())); // HELLO
safeCast(val, Integer.class)
.ifPresentOrElse(
n -> System.out.println(n),
() -> System.out.println("Not an Integer") // prints this
);Errores habituales que debe evitar
Tenga cuidado con estos errores habituales de conversión:
- Olvidar la conversión antes de dividir:
int/intsiempre produce un entero - Hacer downcast sin comprobar con instanceof → ClassCastException
- Confundir el upcasting (seguro) con el downcasting (arriesgado)
- Confundir la conversión de tipos envoltorio:
(int) longValfrente alongVal.intValue()
// Mistake 1: integer division
double avg = 7 / 2; // 3.0 — WRONG
double fixed = 7.0 / 2; // 3.5 — correct
// Mistake 2: unwrapping Long as int
Long bigId = 1234567890123L;
// int id = (int) bigId; // compiles but truncates!
long id = bigId; // correct
System.out.println(avg); // 3.0
System.out.println(fixed); // 3.5
System.out.println(id); // 1234567890123Comprobación rápida
¿Cuál es la salida de este código?
int a = 7; int b = 2; double result = (double) a / b; System.out.println(result);
Resumen: conversión de tipos en la práctica
Ideas clave:
- El upcast (subtipo → supertipo) es implícito y siempre seguro
- El downcast (supertipo → subtipo) requiere una conversión explícita; use instanceof primero
- El pattern matching con instanceof combina la comprobación y la conversión en una sola expresión
- Convierta el numerador a double antes de dividir para evitar el truncamiento de enteros
- Use el pattern matching de switch para seleccionar claramente según el tipo
- Implemente utilidades safeCast para trabajar con Optional en lugar de excepciones
Preguntas frecuentes
¿La lección «Conversiones de tipos en la práctica» es gratis?
Sí — el texto completo de «Conversiones de tipos en la práctica» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Conversiones de tipos en la práctica»?
Aplique conversiones de tipos en situaciones reales, incluidos cálculos numéricos y jerarquías de POO. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Conversiones de tipos en la práctica»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tipos primitivos frente a tipos de referencia
- Conversiones de ampliación y reducción
- El operador instanceof
- Conversiones de tipos en la práctica