- 1 1. ¿Qué es el casting en Java? (Respuesta rápida)
- 2 2. El casting en Java tiene dos tipos: Numérico vs Referencia
- 3 3. Numeric Casting in Java: Implicit vs Explicit Casting
- 3.1 3.1 Implicit Casting (Widening Conversion) Examples
- 3.2 3.2 Explicit Casting (Narrowing Conversion) and Truncation Behavior
- 3.3 3.3 Overflow and Underflow: The Hidden Danger
- 3.4 3.4 Common Compiler Error: “Possible Lossy Conversion”
- 3.5 3.5 Unexpected Casting Behavior Inside Expressions
- 3.6 3.6 Regla Práctica (Para Proyectos Reales)
- 4 4. Casting de Referencias: Upcasting vs Downcasting
- 4.1 4.1 Upcasting (Hijo → Padre) es Seguro y Usualmente Implícito
- 4.2 4.2 Lo Que Pierdes al Hacer Upcasting
- 4.3 4.3 Downcasting (Padre → Hijo) es Riesgoso y Requiere Casting Explícito
- 4.4 4.4 Por Qué el Downcasting es Peligroso: ClassCastException
- 4.5 4.5 Tipo de Variable vs Tipo en Tiempo de Ejecución (El Concepto Clave)
- 5 5. Use instanceof Antes del Downcasting (Patrón Seguro)
- 6 6. Cómo reducir los casts en el diseño Java del mundo real
- 7 7. Boxing/Unboxing vs Casts (Confusión común)
- 8 8. Generics y Casting: Entendiendo las advertencias unchecked
- 9 9. Errores comunes al hacer casting (Ejemplos cortos para copiar y pegar)
- 9.1 9.1 Casting numérico: Esperar redondeo en lugar de truncamiento
- 9.2 9.2 Casting numérico: Sorpresa con la división entera
- 9.3 9.3 Casting numérico: Desbordamiento al convertir números grandes
- 9.4 9.4 Casting de referencias: Downcasting que produce ClassCastException
- 9.5 9.5 Casting de referencias: Perder métodos de la subclase tras upcasting
- 9.6 9.6 Generics: Ignorar unchecked cast y romper en tiempo de ejecución
- 9.7 9.7 Trampa de Comparación de Wrappers: Usar == en lugar de equals()
- 9.8 9.8 Error por Desempaquetado Nulo (NullPointerException)
- 10 10. Preguntas Frecuentes (Preguntas sobre Casting en Java)
- 10.1 10.1 ¿Qué es el casting (conversión de tipos) en Java?
- 10.2 10.2 ¿Cuál es la diferencia entre conversión implícita y casting explícito?
- 10.3 10.3 ¿(int) 3.9 redondea el número?
- 10.4 10.4 ¿Por qué es arriesgado convertir de double a int?
- 10.5 10.5 ¿Cuál es la diferencia entre upcasting y downcasting?
- 10.6 10.6 ¿Qué causa ClassCastException y cómo lo soluciono?
- 10.7 10.7 ¿Debo usar siempre instanceof antes de hacer downcasting?
- 10.8 10.8 ¿Está bien ignorar las advertencias de unchecked cast?
- 10.9 10.9 ¿Cómo puedo diseñar el código para evitar demasiados castings?
1. ¿Qué es el casting en Java? (Respuesta rápida)
En Java, casting significa tratar un valor o un objeto como un tipo diferente.
Usas casting cuando quieres convertir números (como double a int) o cuando quieres manejar un objeto como un tipo de clase más específico (como Animal a Dog).
El casting es poderoso, pero también puede ser riesgoso:
- El casting numérico puede cambiar el valor real (truncando decimales o desbordando).
- El casting de referencias puede causar errores en tiempo de ejecución si el tipo real del objeto no coincide.
Este artículo explica el casting en Java de una manera que te ayuda a escribir código seguro y evitar trampas comunes.
1.1 Lo que aprenderás en esta guía
El casting en Java se vuelve mucho más fácil una vez que lo separas en dos categorías:
- Casting numérico (tipos primitivos) Casting entre tipos como
int,long,double, etc. La pregunta clave es si la conversión es segura o pierde información. - Casting de referencias (clases e interfaces) Casting de objetos en una jerarquía de herencia, como upcasting y downcasting. La pregunta clave es si el tipo real en tiempo de ejecución del objeto coincide con el cast.
Si mezclas estos dos temas demasiado pronto, el casting parece confuso.
Así que los aprenderemos paso a paso.
1.2 Situaciones comunes donde se usa el casting
Ejemplo 1: Convertir un número decimal en un entero
double price = 19.99;
int yen = (int) price; // 19 (decimal part is removed)
Esto es una conversión estrechante, por lo que Java requiere casting explícito.
Ejemplo 2: Tratar una referencia de tipo padre como un tipo hijo
Animal a = new Dog(); // upcasting
Dog d = (Dog) a; // downcasting
Esto funciona solo si el objeto real es realmente un Dog.
Si no, el programa se bloqueará en tiempo de ejecución.
1.3 Los dos principales riesgos del casting
El casting se vuelve peligroso por dos razones principales:
1) El casting numérico puede cambiar el valor
- Los decimales se truncan (no se redondean)
- Los valores pueden desbordarse cuando el tipo objetivo es demasiado pequeño
2) El casting de referencias puede hacer que tu programa se bloquee
- Los downcasts incorrectos causan
ClassCastException
Si recuerdas estos dos riesgos, evitarás la mayoría de los errores de casting.
1.4 Términos que la gente confunde con el casting
Antes de continuar, aquí hay algunos términos que parecen similares pero significan cosas diferentes:
- Conversión implícita Java convierte automáticamente tipos en situaciones seguras (usualmente conversiones ampliantes).
- Casting explícito Escribes
(type)manualmente cuando la información puede perderse. - Boxing / unboxing Conversión automática entre primitivos (
int) y clases wrapper (Integer). Esto no es lo mismo que el casting, pero a menudo causa errores.
2. El casting en Java tiene dos tipos: Numérico vs Referencia
Para entender correctamente el casting en Java, debes dividirlo en:
- Casting numérico (tipos primitivos)
- Casting de referencias (objetos)
Estos dos siguen reglas diferentes y causan diferentes tipos de problemas.
2.1 Casting numérico (tipos primitivos)
El casting numérico convierte un tipo numérico primitivo en otro, como:
- Enteros:
byte,short,int,long - Puntos flotantes:
float,double - Caracteres:
char(internamente numérico)
Ejemplo: Casting numérico
double d = 10.5;
int i = (int) d; // 10
Esto es una conversión estrechante, por lo que se requiere casting explícito.
Conversiones ampliantes vs estrechantes (importante)
Las conversiones numéricas se agrupan en:
- Conversión ampliantes (rango más pequeño → rango más grande) Ejemplo:
int → long,int → doubleUsualmente segura, por lo que Java permite conversión implícita. - Conversión estrechante (rango más grande → rango más pequeño) Ejemplo:
double → int,long → shortRiesgosa, por lo que Java requiere casting explícito.
2.2 Casting de referencias (clases e interfaces)
El casting de referencias cambia cómo se trata un objeto dentro de una jerarquía de herencia.
No se trata de cambiar el objeto en sí, sino de cambiar el tipo de la referencia.
Jerarquía de ejemplo:
Animal(parent)Dog(child)Animal a = new Dog(); // upcasting Dog d = (Dog) a; // downcasting
Reference casting is tightly connected to polymorphism in object-oriented programming.
2.3 “Danger” Means Different Things in Numeric vs Reference Casting
This is the most important mental model:
Numeric casting risk
- The code runs, but the value may change unexpectedly.
Reference casting risk
- The code compiles, but the program may crash at runtime.
2.4 Key Takeaway (Memorize This)
If you ever feel stuck, come back to this:
- Numeric casting → “You can convert, but the value might change.”
- Reference casting → “You can cast, but a wrong cast can crash.”
3. Numeric Casting in Java: Implicit vs Explicit Casting
Numeric casting in Java becomes easy once you understand one simple rule:
- Widening conversions are usually automatic (implicit).
- Narrowing conversions require manual casting (explicit) because data may be lost.
This section explains the difference with practical examples and common mistakes.
3.1 Implicit Casting (Widening Conversion) Examples
Java allows implicit conversion when the target type can safely represent the original value range.
Example: int → double
int i = 10;
double d = i;
System.out.println(d); // 10.0
This is safe because double can represent a much larger range than int.
Example: byte → int
byte b = 100;
int i = b;
System.out.println(i); // 100
Since int has a wider range than byte, Java converts automatically.
3.2 Explicit Casting (Narrowing Conversion) and Truncation Behavior
When converting to a smaller or more limited type, Java requires explicit casting.
Example: double → int
double d = 10.9;
int i = (int) d;
System.out.println(i); // 10
Important detail:
- Casting to
intdoes not round . - It truncates the decimal part.
So:
10.9becomes1010.1becomes10-10.9becomes-10(moves toward zero)
Example: long → int
long l = 100L;
int i = (int) l;
System.out.println(i); // 100
This looks safe, but it becomes dangerous when the long value exceeds the int range.
3.3 Overflow and Underflow: The Hidden Danger
Narrowing conversions are risky not only because decimals get removed, but also because values can overflow.
Example: Casting a large long into int
long l = 3_000_000_000L; // 3 billion (too large for int)
int i = (int) l;
System.out.println(i); // unexpected result
This is one of the worst kinds of bugs because:
- The code compiles
- The program runs
- But the value becomes incorrect silently
3.4 Common Compiler Error: “Possible Lossy Conversion”
If you try narrowing conversion without an explicit cast, Java stops you with a compiler error.
Example: double to int without casting
double d = 1.5;
int i = d; // compile-time error
The message usually includes something like:
possible lossy conversion
Meaning:
- “This conversion may lose information.”
- “You must write the cast manually if you really want it.”
Example: long to int without casting
long l = 100L;
int i = l; // compile-time error
Even though 100 is safe, Java blocks it because long could hold much larger values.
3.5 Unexpected Casting Behavior Inside Expressions
A common beginner mistake is assuming Java automatically produces decimals in division.
Example: Integer division truncates results
int a = 5;
int b = 2;
System.out.println(a / b); // 2
Because both operands are int, the result is also int.
Fix: Cast one operand to double
int a = 5;
int b = 2;
System.out.println((double) a / b); // 2.5
3.6 Regla Práctica (Para Proyectos Reales)
Para evitar errores de conversión numérica, siga estas reglas:
- Conversiones de ampliación son lo suficientemente seguras para conversiones implícitas.
- Conversiones de reducción deben ser explícitas, y debe aceptar que los valores pueden cambiar.
Siempre tenga cuidado al convertir: wp:list /wp:list
- punto flotante → entero (truncamiento)
- tipo grande → tipo más pequeño (desbordamiento)
4. Casting de Referencias: Upcasting vs Downcasting
El casting de referencias trata con objetos, no con valores numéricos.
En lugar de convertir un número, está cambiando cómo Java maneja una referencia a un objeto dentro de una jerarquía de herencia.
La regla más importante es:
En el casting de referencias, lo que importa es el tipo real en tiempo de ejecución del objeto, no el tipo de la variable.
4.1 Upcasting (Hijo → Padre) es Seguro y Usualmente Implícito
Upcasting significa tratar un objeto de una clase hija como su tipo padre.
Esto es extremadamente común en Java y generalmente es seguro.
Ejemplo: Upcasting de un Dog a un Animal
class Animal {
void eat() {
System.out.println("eat");
}
}
class Dog extends Animal {
void bark() {
System.out.println("bark");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Animal a = dog; // upcasting (implicit)
a.eat(); // OK
}
}
Esto funciona porque cada Dog es un Animal.
4.2 Lo Que Pierdes al Hacer Upcasting
El upcasting es seguro, pero cambia qué métodos son visibles a través del tipo de referencia.
Animal a = new Dog();
a.bark(); // compile-time error
Aunque el objeto real sea un Dog, el tipo de la variable es Animal, por lo que Java solo permite los métodos definidos en Animal.
4.3 Downcasting (Padre → Hijo) es Riesgoso y Requiere Casting Explícito
Downcasting significa convertir una referencia de tipo padre de nuevo a un tipo hijo.
Animal a = new Dog();
Dog d = (Dog) a; // downcasting (explicit)
d.bark(); // OK
Esto funciona solo si el objeto real es realmente un Dog.
4.4 Por Qué el Downcasting es Peligroso: ClassCastException
Si el objeto real no es del tipo objetivo, el programa falla en tiempo de ejecución.
Animal a = new Animal();
Dog d = (Dog) a; // ClassCastException at runtime
Esto compila porque Java ve una posible relación de herencia, pero en tiempo de ejecución el objeto no puede convertirse en un Dog.
4.5 Tipo de Variable vs Tipo en Tiempo de Ejecución (El Concepto Clave)
Animal a = new Dog();
En este caso:
- Tipo de variable (tiempo de compilación):
Animal - Tipo en tiempo de ejecución (objeto real):
Dog
Java permite esto gracias al polimorfismo, pero el downcasting debe coincidir con el tipo en tiempo de ejecución.
5. Use instanceof Antes del Downcasting (Patrón Seguro)
Para prevenir ClassCastException, debe comprobar primero el tipo en tiempo de ejecución.
5.1 Qué Hace instanceof
instanceof verifica si un objeto es una instancia de un tipo dado.
if (obj instanceof Dog) {
// obj can be treated as a Dog safely
}
Esto verifica el tipo real en tiempo de ejecución, no el tipo de variable declarado.
5.2 El Patrón Seguro de Downcasting Estándar
Animal a = new Dog();
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark();
}
Esto evita fallos asegurando que el casting solo ocurra cuando sea válido.
5.3 Qué Ocurre sin instanceof (Fallo Común)
Animal a = new Animal();
Dog d = (Dog) a; // runtime crash
Por eso instanceof se considera la herramienta de seguridad por defecto.
5.4 Pattern Matching para instanceof (Sintaxis Moderna Más Limpia)
Las versiones más recientes de Java admiten una forma más legible:
Estilo tradicional
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark();
}
Estilo de pattern matching
if (a instanceof Dog d) {
d.bark();
}
Ventajas:
- No se necesita casting manual
- La variable
dsolo existe dentro del bloqueif - Código más limpio y seguro
5.5 Cuando instanceof se convierte en un olor de diseño
Si empiezas a escribir código así en todas partes:
if (a instanceof Dog) {
...
} else if (a instanceof Cat) {
...
} else if (a instanceof Bird) {
...
}
Podría significar que a tu diseño le falta polimorfismo o una mejor estructura de interfaces.
En la siguiente parte, discutiremos cómo reducir los casts mejorando el diseño.
6. Cómo reducir los casts en el diseño Java del mundo real
A veces es necesario hacer casts, pero en bases de código profesionales, los casts frecuentes a menudo indican un problema de diseño.
Si ves mucho de:
- comprobaciones
instanceof - downcasts repetidos
- cadenas largas de
if/elsepor tipo
…normalmente significa que el código está luchando contra el diseño orientado a objetos en lugar de usarlo.
6.1 El clásico patrón de “explosión de casts”
Este es un anti‑patrón común:
void process(Animal a) {
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark();
} else if (a instanceof Cat) {
Cat c = (Cat) a;
c.meow();
}
}
Esto funciona, pero crea problemas a largo plazo:
- Agregar un nuevo subtipo te obliga a modificar
process() - El método necesita conocer cada subtipo
- El código se vuelve más difícil de mantener y ampliar

6.2 Usa polimorfismo en lugar de casts
La solución limpia es mover el comportamiento a la jerarquía de clases.
class Animal {
void sound() {
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("bark");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("meow");
}
}
Ahora tu lógica se vuelve simple y sin casts:
void process(Animal a) {
a.sound(); // no casting needed
}
Esta es la idea central del polimorfismo:
- La llamada al método permanece igual
- El tipo en tiempo de ejecución decide el comportamiento
6.3 Define el comportamiento requerido en un tipo padre o interfaz
Muchos casts ocurren por una razón:
“Necesito un método específico de la subclase, pero el tipo padre no lo define.”
Si el comportamiento es realmente necesario, defínelo en el nivel superior.
Ejemplo: diseño basado en interfaces
interface Speaker {
void speak();
}
class Dog implements Speaker {
public void speak() {
System.out.println("bark");
}
}
class Cat implements Speaker {
public void speak() {
System.out.println("meow");
}
}
Ahora puedes escribir:
void process(Speaker s) {
s.speak(); // no downcast needed
}
6.4 Cuándo el downcasting es realmente razonable
El downcasting no siempre es malo. Puede ser aceptable cuando:
- un framework devuelve tipos genéricos como
Object - estás integrando APIs heredadas
- estás manejando eventos o callbacks con tipos base compartidos
Incluso entonces, mantenlo seguro:
- verifica con
instanceof - mantén el cast en una zona pequeña y controlada
- evita propagar casts por todo tu código
7. Boxing/Unboxing vs Casts (Confusión común)
Java tiene dos mundos de tipos numéricos:
- primitivos :
int,double, etc. - clases wrapper :
Integer,Double, etc.
La conversión automática entre ellos se llama:
- boxing : primitivo → wrapper
- unboxing : wrapper → primitivo
Esto no es lo mismo que un cast, pero puede causar errores en tiempo de ejecución.
7.1 Ejemplo de autoboxing (int → Integer)
int x = 10;
Integer y = x; // autoboxing
System.out.println(y); // 10
7.2 Ejemplo de auto-unboxing (Integer → int)
Integer x = 10;
int y = x; // auto-unboxing
System.out.println(y); // 10
7.3 Caso peligroso: null + unboxing = error
Integer x = null;
int y = x; // NullPointerException
Esto parece una asignación normal, pero el unboxing requiere un objeto real.
7.4 Trampa de comparación de wrappers: No uses == para valores
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // may be false
Usa equals() para comparar valores:
System.out.println(a.equals(b)); // true
8. Generics y Casting: Entendiendo las advertencias unchecked
En proyectos reales, a menudo verás advertencias como:
unchecked castunchecked conversion
Estas advertencias significan:
“El compilador no puede demostrar que este casting sea seguro en tiempo de ejecución.”
8.1 Causa común: Tipos sin parametrizar (Raw Types)
import java.util.*;
public class Main {
public static void main(String[] args) {
List list = new ArrayList(); // raw type
list.add("Hello");
List<Integer> numbers = (List<Integer>) list; // unchecked warning
Integer x = numbers.get(0); // may crash
System.out.println(x);
}
}
Esto no es seguro porque la lista realmente contiene un String.
8.2 Solución: Usar tipos genéricos adecuados
List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);
System.out.println(s);
No se necesita casting y el compilador te protege.
8.3 Si debes suprimir advertencias, hazlo de forma mínima
A veces no puedes evitar el casting (APIs heredadas, bibliotecas externas).
En esos casos:
- haz el cast en un lugar pequeño
- documenta por qué es seguro
- suprime la advertencia solo en el alcance más pequeño
Ejemplo:
@SuppressWarnings("unchecked")
List<String> list = (List<String>) obj;
9. Errores comunes al hacer casting (Ejemplos cortos para copiar y pegar)
El casting es fácil de “entender en teoría”, pero sigue siendo fácil equivocarse en código real.
Esta sección muestra los errores más comunes con ejemplos breves que puedes reproducir rápidamente.
La mejor forma de aprender casting es:
- ver el fallo
- entender por qué falla
- aprender la solución segura
9.1 Casting numérico: Esperar redondeo en lugar de truncamiento
Error: Pensar que (int) redondea el valor
double x = 9.9;
int y = (int) x;
System.out.println(y); // 9
Java no redondea aquí. Trunca la parte decimal.
9.2 Casting numérico: Sorpresa con la división entera
Error: Esperar 2.5 pero obtener 2
int a = 5;
int b = 2;
System.out.println(a / b); // 2
Porque ambos operandos son int, el resultado también es int.
Solución: Convertir uno de los operandos a double
int a = 5;
int b = 2;
System.out.println((double) a / b); // 2.5
9.3 Casting numérico: Desbordamiento al convertir números grandes
Error: Convertir un long grande a int
long l = 3_000_000_000L;
int i = (int) l;
System.out.println(i); // unexpected value
Compila y se ejecuta, pero el valor queda incorrecto por desbordamiento.
9.4 Casting de referencias: Downcasting que produce ClassCastException
Error: Convertir un objeto al subtipo incorrecto
class Animal {}
class Dog extends Animal {}
public class Main {
public static void main(String[] args) {
Animal a = new Animal();
Dog d = (Dog) a; // ClassCastException
}
}
Solución: Usar instanceof
Animal a = new Animal();
if (a instanceof Dog) {
Dog d = (Dog) a;
// safe usage
} else {
System.out.println("Not a Dog, so no cast.");
}
9.5 Casting de referencias: Perder métodos de la subclase tras upcasting
Error: “Es un Dog, ¿por qué no puedo llamar a bark()?”
class Animal {}
class Dog extends Animal {
void bark() {
System.out.println("bark");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
// a.bark(); // compile-time error
}
}
El tipo de la variable es Animal, por lo que Java solo permite los métodos declarados en Animal.
9.6 Generics: Ignorar unchecked cast y romper en tiempo de ejecución
Error: Tipo crudo + cast inseguro
import java.util.*;
public class Main {
public static void main(String[] args) {
List list = new ArrayList(); // raw type
list.add("Hello");
List<Integer> numbers = (List<Integer>) list; // unchecked warning
Integer x = numbers.get(0); // may crash
System.out.println(x);
}
}
Solución: Usar genéricos correctamente
List<String> list = new ArrayList<>();
list.add("Hello");
String s = list.get(0);
System.out.println(s);
9.7 Trampa de Comparación de Wrappers: Usar == en lugar de equals()
Error: Comparar valores de wrappers con ==
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // may be false
Solución: Usar equals()
System.out.println(a.equals(b)); // true
9.8 Error por Desempaquetado Nulo (NullPointerException)
Error: Desempaquetar null
Integer x = null;
int y = x; // NullPointerException
Solución: Verificar si es nulo (o usar tipos primitivos cuando sea posible)
Integer x = null;
if (x != null) {
int y = x;
System.out.println(y);
} else {
System.out.println("x is null");
}
10. Preguntas Frecuentes (Preguntas sobre Casting en Java)
10.1 ¿Qué es el casting (conversión de tipos) en Java?
El casting consiste en tratar un valor u objeto como de un tipo diferente.
El casting en Java tiene dos categorías principales:
- casting numérico (primitivos)
- casting de referencia (objetos)
10.2 ¿Cuál es la diferencia entre conversión implícita y casting explícito?
- Conversión implícita ocurre automáticamente en situaciones seguras (principalmente conversiones de ampliación).
- Casting explícito requiere
(tipo)y es necesario cuando se puede perder información (conversiones de reducción).
10.3 ¿(int) 3.9 redondea el número?
No. Lo trunca.
System.out.println((int) 3.9); // 3
10.4 ¿Por qué es arriesgado convertir de double a int?
Porque elimina los decimales (pérdida de datos).
Además, valores grandes pueden desbordarse al convertirse a tipos numéricos más pequeños.
10.5 ¿Cuál es la diferencia entre upcasting y downcasting?
- Upcasting (subclase → superclase) es seguro y suele ser implícito.
- Downcasting (superclase → subclase) es arriesgado y requiere casting explícito.
Un downcasting incorrecto puede provocar ClassCastException.
10.6 ¿Qué causa ClassCastException y cómo lo soluciono?
Ocurre cuando el tipo real del objeto en tiempo de ejecución no coincide con el tipo al que se está intentando convertir.
Solución: comprobar con instanceof antes de hacer el casting.
10.7 ¿Debo usar siempre instanceof antes de hacer downcasting?
Si existe alguna posibilidad de que el tipo en tiempo de ejecución no coincida, sí.
Es el enfoque seguro estándar.
Java moderno también admite coincidencia de patrones:
if (a instanceof Dog d) {
d.bark();
}
10.8 ¿Está bien ignorar las advertencias de unchecked cast?
Generalmente no.
La mayoría de las advertencias unchecked provienen de tipos crudos o castings inseguros.
Soluciona la causa raíz usando genéricos correctamente.
Si realmente no puedes evitarlo (APIs heredadas), aísla el casting y suprime la advertencia en el ámbito más pequeño posible.
10.9 ¿Cómo puedo diseñar el código para evitar demasiados castings?
Utiliza características de diseño orientado a objetos como:
- polimorfismo (sobrescribir comportamiento en subclases)
- interfaces (definir el comportamiento requerido en un tipo común)
Si constantemente escribes cadenas de instanceof, puede ser una señal de que el diseño necesita mejoras.

