Definición:
El casteo (casting) es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relación de herencia entre ambas.
Existen distintos tipos de casteo (casting) de acuerdo a si se utilizan tipos de datos o clases.
Casteo Implícito (Widening Casting)
El casteo implícito radica en que no se necesita escribir código para que se lleve a cabo. Ocurre cuando se realiza una conversión ancha – widening casting – es decir, cuando se coloca un valor pequeño en un contenedor grande.
Ejemplo:
//Define una variable de tipo int con el valor 100
int numeroEntero = 100;
//Define una variable de tipo long a partir de un int
long numeroLargo = numero;
Casteo Explicito (Narrowing Casting)
El casteo explicito se produce cando se realiza una conversión estrecha – narrowing casting – es decir, cuando se coloca un valor grande en un contenedor pequeño. Son susceptibles de perdida de datos y deben realizarse a través de código fuente, de forma explicita.
Ejemplo:
//Define una variable del tipo int con el valor 250
int numeroEntero = 250;
//Define una variable del tipo short y castea la variable numero
short s = (short) numero;
Upcasting
El upcasting se produce a nivel objetos. Suponiendo que existe una clase Empleado y clase Ejecutivo, la cual es una subclase de esta. Un Ejecutivo entonces ES UN Empleado y se puede escribir de la siguiente forma:
//Instancia un ejecutivo en una variable de tipo Empleado
Empleado e1 = new Ejecutivo (“Maximo Dueño”, 2000);
El casteo (casting) es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relación de herencia entre ambas.
Existen distintos tipos de casteo (casting) de acuerdo a si se utilizan tipos de datos o clases.
Casteo Implícito (Widening Casting)
El casteo implícito radica en que no se necesita escribir código para que se lleve a cabo. Ocurre cuando se realiza una conversión ancha – widening casting – es decir, cuando se coloca un valor pequeño en un contenedor grande.
Ejemplo:
//Define una variable de tipo int con el valor 100
int numeroEntero = 100;
//Define una variable de tipo long a partir de un int
long numeroLargo = numero;
Casteo Explicito (Narrowing Casting)
El casteo explicito se produce cando se realiza una conversión estrecha – narrowing casting – es decir, cuando se coloca un valor grande en un contenedor pequeño. Son susceptibles de perdida de datos y deben realizarse a través de código fuente, de forma explicita.
Ejemplo:
//Define una variable del tipo int con el valor 250
int numeroEntero = 250;
//Define una variable del tipo short y castea la variable numero
short s = (short) numero;
Upcasting
El upcasting se produce a nivel objetos. Suponiendo que existe una clase Empleado y clase Ejecutivo, la cual es una subclase de esta. Un Ejecutivo entonces ES UN Empleado y se puede escribir de la siguiente forma:
//Instancia un ejecutivo en una variable de tipo Empleado
Empleado e1 = new Ejecutivo (“Maximo Dueño”, 2000);
A esta operación en donde un objeto
de una clase derivada se asigna a una referencia cuyo tipo es alguna de las
superclases se la denomina upcasting.
Cuando se realiza este tipo de operaciones, hay que tener cuidado porque para la referencia e1 no existen los atributos y métodos que se definieron en la clase Ejecutivo, aunque la referencia apunte a un objeto de este tipo.
Por el contrario, si ahora existe una variable de tipo Empleado y se desea acceder a los métodos de la clase derivada – suponiendo que contiene un método ejecutarPlanificacion() en la clase Ejecutivo – teniendo una referencia de una clase base, como en el ejemplo anterior, hay que convertir explícitamente la referencia de un tipo a otro. Esto se hace con el operador de cast de la siguiente forma:
//Instancia un ejecutivo en una variable de tipo Empleado
Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);
//Se convierte (o castea) la referencia de tipo
Ejecutivo ej = (Ejecutivo) emp;
//Usamos el método de la clase Ejecutivo
ej.ejecutarPlanificacion();
La expresión de la segunda línea convierte la referencia de tipo Empleado asignándola a una referencia de tipo Ejecutivo. Para el compilador es correcto porque Ejecutivo es una clase derivada de Empleado. En tiempo de ejecución la JVM convertirá la referencia si efectivamente emp apunta a un objeto de la clase Ejecutivo, caso contrario lanzara una excepción.
Por el contrario, si intenta realizar lo siguiente:
Empleado emp = new Empleado (“Mario Gómez”, 2000);
Ejecutivo ej = (Ejecutivo) emp;
No dará problemas de compilación, pero al ejecutar se pero al ejecutar se producirá un error ya que la referencia emp apunta a un objeto de la clase Empleado y no a un objeto de clase Ejecutivo.
Cuando se realiza este tipo de operaciones, hay que tener cuidado porque para la referencia e1 no existen los atributos y métodos que se definieron en la clase Ejecutivo, aunque la referencia apunte a un objeto de este tipo.
Por el contrario, si ahora existe una variable de tipo Empleado y se desea acceder a los métodos de la clase derivada – suponiendo que contiene un método ejecutarPlanificacion() en la clase Ejecutivo – teniendo una referencia de una clase base, como en el ejemplo anterior, hay que convertir explícitamente la referencia de un tipo a otro. Esto se hace con el operador de cast de la siguiente forma:
//Instancia un ejecutivo en una variable de tipo Empleado
Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);
//Se convierte (o castea) la referencia de tipo
Ejecutivo ej = (Ejecutivo) emp;
//Usamos el método de la clase Ejecutivo
ej.ejecutarPlanificacion();
La expresión de la segunda línea convierte la referencia de tipo Empleado asignándola a una referencia de tipo Ejecutivo. Para el compilador es correcto porque Ejecutivo es una clase derivada de Empleado. En tiempo de ejecución la JVM convertirá la referencia si efectivamente emp apunta a un objeto de la clase Ejecutivo, caso contrario lanzara una excepción.
Por el contrario, si intenta realizar lo siguiente:
Empleado emp = new Empleado (“Mario Gómez”, 2000);
Ejecutivo ej = (Ejecutivo) emp;
No dará problemas de compilación, pero al ejecutar se pero al ejecutar se producirá un error ya que la referencia emp apunta a un objeto de la clase Empleado y no a un objeto de clase Ejecutivo.
