Casting de variables de referencia (Conversión)

  • En Animal animal = new Perro(); la variable de referencia del tipo Animal contiene realmente un perro, pero los métodos específicos de la clase Perro no funcionan. Sólo funcionan los métodos overriden de la superclase Animal.
  • En Perro p = (Perro) animal; todos los métodos de la subclase Perro funcionan. Aquí hay una conversión hacia abajo (downcast).
  • Ejemplo:

// Si la clase Animal es pública, entonces debe estar en un archivo Animal.java
class Animal{
	void hacerRuido(){
		System.out.println("Ruidos genericos de animales");
	}
}

// Si la clase Perro es pública, entonces debe estar en un archivo Perro.java
class Perro extends Animal{
	// Método Overriden de la superclase Animal
	void hacerRuido(){
		System.out.println("Ladrar");
	}
	void darLaPatita(){
		System.out.println("Dar la patita");
	}
}

class AplicacionConversion{
	public static void main(String[] args){
		Animal[] a = {new Animal(), new Perro()};
		for (Animal animal : a){
			animal.hacerRuido();
			if (animal instanceof Perro){
				// animal.darLaPatita(); No funciona
				Perro p = (Perro) animal; // downcast
				Animal b = (Perro) animal; // Compila y no funciona con b.darLaPatita();
				p.darLaPatita();
			}
		}
	}
}

java.lang.ClassCastException:
class Animal { }
class Perro extends Animal { }
class AplicacionPerro {
   public static void main(String [] args) {
      Animal animal = new Animal();
      Perro p = (Perro) animal; // compila, pero falla después
  }
}
  • Ejemplo de upcast:
class Animal { } class Perro extends Animal { } class AplicacionPerro2 { public static void main(String [] args) { Perro d = new Perro(); Animal a1 = d; // upcast con no-explícita cast Animal a2 = (Animal) d; // upcast con explícita cast } }