Conversiones y Coerciones

A diferencia de Perl no existen conversiones automáticas de tipo, en el caso de que este se haya determinado. Es conveniente hacer una conversión explícita:

groovy:000> String a = 1; a = 4; a = a+1
===> 41
groovy:000> String a = 1; a = 4; a = a*2
===> 44
groovy:000> String a = 1; a = 4; a = a*3
===> 444
groovy:000> String a = 2; b = a.toInteger(); b = b*2
===> 4
Si la cadena contiene un número y se hace coerción explícita también funciona. Pero si la cadena no contiene un número se produce una excepción:
groovy:000> b = "432"
===> 432
groovy:000> b.class
===> class java.lang.String
groovy:000> c = b as Integer
===> 432
groovy:000> c.class
===> class java.lang.Integer
groovy:000> d = "432b"
===> 432b
groovy:000> e = d as Integer
ERROR java.lang.NumberFormatException: For input string: "432b"
        at groovysh_evaluate.run (groovysh_evaluate:3)
        ...

Sin embargo, si que se produce coerción implícita entre tipos numéricos. Se llama coerción a la promoción de uno de los argumentos de un operador al tipo mas general:

groovy:000> a = 1+1.0
===> 2.0
groovy:000> a.class
===> class java.math.BigDecimal

Podemos hacer la coerción explícita:

groovy:000> b = 1 as BigDecimal
===> 1
groovy:000> b.class
===> class java.math.BigDecimal

También funciona de número a String:

groovy:000> d = 65
===> 65
groovy:000> d.class
===> class java.lang.Integer
groovy:000> c = d as String
===> 65
groovy:000> c.class
===> class java.lang.String
groovy:000> c
===> 65
groovy:000> c[1]
===> 5
groovy:000> e = 8.5
===> 8.5
groovy:000> f = e as String
===> 8.5
groovy:000> f.class
===> class java.lang.String
groovy:000> f[1]
===> .
groovy:000> f[2]
===> 5
En realidad, la conversión a String funcionará siempre que la clase disponga de un método toString. En el siguiente ejemplo usamos una clase escrita por el usuario en la que hemos implementado el método toString:
groovy:000> import Complex
===> [import Complex]
groovy:000> c = new Complex(4.5, 1.0)
===> 4.5 + i
groovy:000> g = c as String
===> 4.5 + i
groovy:000> g.class
===> class java.lang.String
groovy:000> g[2]
===> 5

Casiano Rodríguez León
2010-04-30