Saltar a contenido

Conversiones entre objetos (casting)

Java admite la conversión de tipos con ciertas limitaciones. Consideremos una jerarquía de herencia como la que vemos en el siguiente diagrama de clases, sobre el que vamos a analizar las posibilidades de conversión de tipos de distintas formas.

Casting

Upcasting

El upcasting es el proceso de convertir un objeto de una subclase en un objeto de su superclase. Este tipo de conversión es implícito y seguro en Java porque cualquier instancia de una subclase es también una instancia de su superclase. Esto permite tratar a un objeto como una instancia de su clase padre

Downcasting

El downcasting es el proceso inverso: convertir una referencia de superclase a una referencia de subclase. Este tipo de conversión debe ser explícito en Java, y solo es seguro si el objeto que se está convirtiendo es realmente una instancia de la subclase. Si no lo es, se generará una excepción ClassCastException.

Casting en horizontal

Se trataría de poner lo que está a un lado al otro lado, esto no es posible de ningún modo.

Implementación de casting

Profesor p1; //p1 es tipo Profesor. Admite ser Profesor, ProfesorTitular o ProfesorInterino
ProfesorInterino p44 = new ProfesorInterino(); //p44 es ProfesorInterino.
p1 = p44; // Conversión hacia arriba: sin problema. Ahora p1 que es tipo profesor, almacena un profesor interino
p44 = p1 // ERROR en la conversión hacia abajo.

Determinación del tipo de variables

La palabra clave instanceof, todo en minúsculas, sirve para verificar el tipo de una variable. La sintaxis que emplearemos para instanceof y sus normas de uso serán las siguientes:

  • a. Sólo se pueden comparar instancias que relacionen dentro de la jerarquía de tipos (en cualquier dirección) pero no objetos que no relacionen en una jerarquía. Es decir, no podemos comparar profesores con taxis por ejemplo, porque no relacionarán dentro de una jerarquía.
  • b. Solo se puede usar instanceof asociado a un condicional.
if (profesor43 instanceof ProfesorInterino) {
    
} else { 
    
}

Actividad

  • PR 716 (RA7/ CE7a CE7b CE7c CE7d CE7e CE7f CE7g CE7h CE7i CE7j / IC2 / 5p) Realiza un programa de nombre AppCompra formado por las siguientes clases:

    • Clase abstracta llamada Producto con el atributo protected gasto de tipo double y el método abstracto gastoConIva() que no recibirá parámetros pero devolverá un tipo double.
    • Clase Leche, que hereda de Producto, con el atributo privado litros_leche de tipo entero, que implementa el método gastoConIva(), el cual devolverá gasto de tipo double.
    • Clase Salmón, que hereda de Producto, con el atributo privado kilos_salmon de tipo double, que implementa el método gastoConIva(), el cual devolverá gasto de tipo double.
    • Clase Whisky, que hereda de Producto, con el atributo privado litros_whisky de tipo entero, que implementa el método gastoConIva(), el cual devolverá gasto de tipo double.
    • Existe polimorfismo en el método gastoConIva(), pues realizará las siguientes operaciones en función del producto:

      • Producto Precio unidad IVA Operación realizada en el método gastoConIva()
      • Leche 1.95/litro Superreducido (4%) gasto = (double) litros_leche1.951.04
      • Salmón 11.85/kilo Reducido (8%) gasto = kilos_salmon11.85 1.08
      • Whisky 11.90/litro Normal (21%) gasto = (doublé) litros_whisky11.901.21
    • En el main de la clase AppCompra:

      • Crea, mediante upcasting, un objeto p1 de Producto instanciando al constructor Leche, otro objeto p2 de Producto instanciando al constructor Salmón y un tercero p3 de Producto instanciando al constructor Whisky.
      • A continuación, debe invocarse el método gastoConIva aplicado a p1 y mostrar por pantalla su gasto.
      • Seguidamente debe invocarse el método gastoConIva aplicado a p2 y mostrar su gasto.
      • Finalmente debe invocarse el método gastoConIva aplicado a p3 y mostrar su gasto