Está en la página 1de 5

CASTING O TRANSFORMACIONES DE TIPO

El 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 relacin de herencia entre ambas (este ltimo casting es el ms importante y se ver ms adelante). Dentro del casting de variables primitivas se distinguen dos clases: Implcito: no se necesita escribir cdigo para que se lleve a cabo. Ocurre cuando se realiza una conversin ancha (widening casting), es decir, cuando se coloca un valor pequeo en un contenedor grande.

Ejemplo 1:

Ejemplo 2: similar al anterior.

En cambio,

Explcito: s es necesario escribir cdigo. Ocurre cuando se realiza una conversin estrecha (narrowing casting), es decir, cuando se coloca un valor grande en un contenedor pequeo. Son susceptibles de prdida de datos.

Ejemplo 1:

NOTA: si se sustituyera la primera lnea int num1=100 por int num1=1000000, el cdigo compilara bien, pero habra prdida de datos, pues el 1000000 se sale del rango de short [-32768, 32767]. Al mostrar por consola el valor se obtendra un resultado incongruente. Ejemplo 2:

Ejemplo 3: continuacin del Ejemplo 2 del casting implcito Para que la lnea

Compile debe hacerse un casting explcito a long

Pero no

porque, en la lnea anterior, 10000000000 es considerado int, mientras que en las de arriba, double. Dicho esto, se va a analizar un ejemplo un tanto extrao. Ejemplo extrao:

Dado que cualquier entero, por defecto, se almacena en un int (4 bytes), con la lnea anterior se pretende colocar un valor grande (el int 10) en un contenedor pequeo (una primitiva de tipo byte con capacidad para 1 byte). Esto, segn lo expuesto anteriormente, precisa de casting explcito.

Pero, resulta que no hace falta, ya que el compilador, cuando se trabaja con enteros, digamos que, provoca un "casting implcito contranatura" y transforma automticamente a byte el int 10. Ocurrira lo mismo si se trabajara con short y char. Lo que pasa (y esto es lo que resulta un tanto extrao) es que no ocurre lo anterior con los decimales: por eso, una lnea como

provoca error de compilacin. Recordar que cualquier decimal, por defecto, se almacena en un double (8 bytes) y que un tipo float tiene capacidad para 4 bytes. En los decimales, el compilador no fuerza el casting implcito contranatura. De ah que sea necesario un casting explcito a float para evitar el fallo de compilacin. NOTA: quiz se evitaran estas situaciones, si el compilador no forzara el casting implcito contranatura a byte, short o char de un int y provocara error de compilacin, del mismo modo que cuando se declara un float y no se castea explcitamente. Pero, de momento, esto es lo que hay.

Cdigo de partida para explicar el casting entre variables primitivas que almacenan datos numricos:

Las lneas 3 y 4 almacenan al nmero 10 mediante una variable primitiva de tipo byte va "casting implcito contranatura", el 3000 mediante una de tipo short, tambin va "casting implcito contranatura". Lo ms intuitivo es definirlas mediante un casting explcito, pero tal y como estn tambin se puede. Supuestamente, la lnea 5, almacena el 3000000000 mediante una variable de tipo long, va casting implcito, pero es falso. Ocurre lo que se ha comentado en el Ejemplo 2 del casting implcito: 3000000000 no es considerado como long sino como int y 3000 millones no pertenece al rango asociado a int (aprox. [-2150 millones, 2150 millones]). Si se intenta compilar, se producira error. Supuestamente, la lnea 6, almacena el 256.5 mediante una variable de tipo float (ocupa 4 bytes en memoria), va "casting implcito contranatura", pero, como se ha comentado en el Ejemplo extrao, es falso, ya que en decimales nunca se produce. Debe castearse explcitamente a float. El cdigo correcto sera:

Una cuestin a tener en cuenta relacionada con el casting entre variables primitivas es la siguiente:

En Java se realizan automticamente conversiones de una variable primitiva de un tipo a otra de otro, de igual o mayor precisin, siempre y cuando se respeten los rangos asociados al tipo convertido. La precisin depende del nmero de bytes ocupados en memoria y del rango de valores asociado: a mayor nmero de bytes ocupados, mayor precisin y mayor rango asociado. As, pasar de byte a short, de short a int, de byte a int, es automtico siempre y cuando el entero a convertir no supere el rango del tipo convertido; en definitiva, pasar de una variable primitiva de un tipo de la cadena de la siguiente lnea a otra que se encuentre a su derecha es automtico. byte-->short-->int-->long-->float-->double As, por ejemplo, si un mtodo necesita un long como argumento y se le pasa un entero perteneciente al rango de int, promociona automticamente a long y no es necesario casting. En cambio, si se le pasa un entero que se sale fuera del rango de int, es necesario realizar un casting para que la llamada al mtodo no provoque error al compilar. Un ejemplo de esto ocurre con el mtodo esttico de java.lang.Thread "void sleep(long retardo)" que introduce un retardo en la ejecucin del cdigo, coincidente con el entero, en milisegundos, que se le pasa al argumento. Este mtodo se estudiar ms adelante.

Por consola: Hola -- Despus de tres segundos -Adios En cambio, si se sustituye Thread.sleep(3000) por Thread.sleep(3000000000) no compila ya que el entero que se le pasa no pertenece al rango de int y no puede promocionar a long automticamente. Para que compile es necesario hacer un casting explcito:

Thread.sleep(3000000000L)

Para finalizar con el casting entre primitivas, conviene tener en cuenta lo siguiente: No es posible realizar casting entre una variable primitiva booleana y cualquier otra variable primitiva. S es posible realizar casting entre una variable primitiva char y una variable primitiva que almacene enteros.

Ejemplo: