You are on page 1of 3

Conversin de tipos en Java.

Como en muchos otros lenguajes de programacin, en Java tambin es posible asignar un valor de un tipo a una variable de otro tipo. Es muy probable que muchos de vosotros no le veis a sto mucha ciencia o mucha dificultad pero tambin es verdad que muchos hacemos la conversin automticamente sin un cierto rigor que nos respalde y cuando el compilador de Java nos da error seguimos intentndolo por el mtodo del "ensayo y error" ;-). Pues para aquellos que aun no lo tienen claro o simplemente para tenerlo todo recogido en este documento y no tener que ir a desempolvar aquel viejo manual o libro con el que empezaste a hacer tus primeros pinitos en Java aqu va este artculo. Adems, esta es la seccin de los que empezamos en esto del Java y la idea es allanar el terreno en lo posible a todo aqul que comienza y afianzar ciertos conceptos antes de pasar a cosas mayores. Veamos a continuacin, cmo hace la conversin de tipos Java: Conversin de tipos automtica. Si al hacer la conversin de un tipo a otro se dan las 2 siguientes premisas: Los dos tipos son compatibles. El tipo de la variable destino es de un rango mayor al tipo de la variable que se va a convertir. entonces, la conversin entre tipos es automtica, sto es, la mquina virtual de Java tiene toda la informacin necesaria para realizar la conversin sin necesidad de "ayuda" externa. A esto se le conoce como conversin implcita y cuando hablamos de los tipos numricos de Java se le da el nombre de widening conversion que traducido vendra a ser algo as como "conversin por ampliacin". No obstante, no todos los tipos numricos son compatibles con char o boolean (concretamente byte y short) y estos dos no lo son entre ellos. Conversin de tipos incompatibles. Cuando alguna de las 2 premisas anteriores no se cumple, entonces la conversin automtica es imposible (salvo que se est evaluando una expresin como se ve en el siguiente apartado), el compilador nos da un error dicindonos algo as como "la variable tal necesita un cast explcito". Pero tranquilo, no es que no podamos realizar tal conversin sino que la JVM necesita que le demos una informacin adicional: el tipo al que vamos a convertir la variable fuente. Pues bien, a esta conversin explcita es a lo que se le llama hacer un casting de tipos. Cuando se trata de tipos numricos a este tipo de conversin se le llama narrowing compresion que se podra traducir como "conversin por estrechamiento" dado que ests "recortando" la variable para poderla meter en el tipo destino. La expresin general del casting de un tipo es: (tipo_destino) valor donde tipo_destino indica el tipo al que queremos hacer la conversin explcita del valor asociado. En el caso de los tipos numricos, al "recortar" el valor de la variable de rango mayor para que quepa en el tipo de rango menor resulta que perdemos informacin. En el ejemplo vers en qu se traduce esa prdida de informacin segn sean los tipos. Promocin de tipos automticamente al evaluar una expresin. Aqu radica a mi modo de ver uno de los puntos donde sto de la conversin nos puede dar la lata si no lo sabemos pero que una vez sabido es una de las muchas ventajas que Java tiene frente a otros lenguajes. El caso es que cuando la mquina virtual de Java tiene que analizar una expresin existe http://www.javahispano.com

la posibilidad real de que el resultado intermedio de una operacin exceda el rango de los operandos. Para solventar este problema lo que Java hace es una promocin automtica de todos los operandos de tipo byte o short a int. Pero sto tambin puede llevar al error de que hagamos una conversin de tipos incompatibles y, al no hacer el casting correspondiente, la compilacin cascar. Mejor que explicarlo con letra lo vemos en el siguiente ejemplo y vers que sencillo es recordarlo para no volver a meter la pata. Caso 1: byte a = 40; byte b = 50; int c = a * b;//el compilador no dar ningn error. Caso 2: byte a = 25; a = a*2; //ERROR: Explicit cast needed to convert int to byte.(conversin Explcita (CAST) se necesaria para convertir int a byte.) Ahora te preguntars, cmo puede dar este error si el resultado no excede del rango de un tipo byte (-128,127). Pues bien, lo que ocurre es que al hacer la multiplicacin, Java ha promocionado automticamente este valor a int y por eso para volver a meterlo en un tipo byte tendremos que hacer una conversin explcita. En el caso 1 este error no se produce porque el resultado de la operacin se guarda en un int. a = (byte)a*2;//ahora el compilador no dar ningn error. Para concluir con las reglas de promocin de tipos cuando evaluamos expresiones aqu van otros detalles ms que hay que tener en cuenta: Si alguno de los operandos es long, entonces la expresin entera promociona a long. Si alguno de los operandos es float, entonces la expresin entera promociona a float. Si alguno de los operandos es double, entonces el resultado ser double. Por ltimo, recuerda que cuando un mtodo nos devuelve Object, dado que esta clase es la superclase de todas, entonces podremos y tenemos que hacer un casting explcito al tipo de la variable que nos interesa. Por ejemplo, si tenemos un vector en el que vamos introduciendo elementos del tipo MiClase, para poderlos recuperar habra que hacer: Miclase var = (MiClase) vector.get(index); //get devuelve Object y hacemos el cast a MiClase para que los tipos sean compatibles. El ejemplo. Bueno, tampoco es que sea un ejemplo, simplemente son una serie de casos prcticos para concluir este artculo. class ConversionTipos { public static void main(String args[]) { byte b;Conversin de tipos en Java int i = 257; double d = 323.142; double d2; http://www.javahispano.com

float f = 5.65f; char c = 'c'; short s = 1024; b = (byte) i;//efecto: se devuelve (i modulo 256), rango de byte. System.out.println(b); i = (int) d;//efecto: truncamiento de la parte decimal. System.out.println(i); b = (byte)d;//efecto: truncamiento y luego (result_truncado modulo 256) System.out.println(b); i = (int)f;//efecto: truncamiento de la parte decimal System.out.println(i); i = c;//correcto por ser int, pero un byte o short necesitara un cast explcito. System.out.println(i); f = c; d = c;//correcto. i = b * c;//efecto: la operacin promociona a int. System.out.println(i); d2 = (f*b) + (i/c) - (d*s); */ efecto: el resultado de la promocin de todas las expresiones es un double: (f*b) promociona a float, (i/c) promociona a int y (d*s) promociona a double. Luego, float + int - double promociona a double. /* System.out.println(d2); { } Leo Suarez est actualmente realizando el Proyecto Fin de Carrera en Java para obtener el ttulo de Ingeniero Superior de Telecomunicaciones por la Universidad de Las Palmas de Gran Canaria. Cuando no est proyectando o escribiendo para javaHispano aprovecha para disfrutar con la novia y los amigos del estupendo clima de esa maravillosa isla. Para cualquier duda o tirn de orejas, e-mail a: leo@javahispano.com

http://www.javahispano.com

You might also like