Dado que una variable de un
determinado tipo puede estar en realidad almacenando un objeto que sea de algún
tipo hijo del tipo de la variable y en ese caso a través de la variable sólo
puede accederse a aquellos miembros del verdadero tipo del objeto que sean
comunes con miembros del tipo de la variable que referencia al objeto, muchas
veces nos va a interesar que una vez que dentro de un método genérico hayamos
determinado cuál es el verdadero tipo de un objeto (por ejemplo, con el
operador is)
podamos tratarlo como tal. En estos casos lo que hay es que hacer una
conversión del tipo padre al verdadero tipo del objeto, y a esto se le llama downcasting
Para realizar un downcasting una
primera posibilidad es indicar preceder la expresión a convertir del tipo en el
que se la desea convertir indicado entre paréntesis. Es decir, siguiendo la
siguiente sintaxis:
(<tipoDestino>)
<expresiónAConvertir>
El resultado de este tipo de
expresión es el objeto resultante de convertir el resultado de <expresiónAConvertir> a <tipoDestino>.
En caso de que la conversión no se pudiese realizar se lanzaría una excepción
del tipo predefinido System.InvalidCastException
Otra forma de realizar el
downcasting es usando el operador as, que se usa así:
<expresiónAConvertir>
as <tipoDestino>
La principal diferencia de este
operador con el anterior es que si ahora la conversión no se pudiese realizar
se devolvería null en lugar de lanzarse una excepción. La otra
diferencia es que as sólo es aplicable a tipos referencia y sólo a
conversiones entre tipos de una misma jerarquía (de padres a hijos o viceversa)
Los errores al realizar
conversiones de este tipo en métodos genéricos se producen cuando el valor
pasado a la variable genérica no es ni del tipo indicado en <tipoDestino> ni existe ninguna definición de
cómo realizar la conversión a ese tipo (cómo definirla se verá en el Tema 11: Redefinición de operadores).