Crear GString a partir de String
Estamos utilizando Groovy de forma segura en cuanto a tipos. En algún momento quiero invocar un método con la siguiente firma:
void foo(GString baa)
Siempre y cuando la cadena que ingrese contenga ${baz}
, todo está bien, pero cuando uso una cadena pura obtengo un error de compilación.
foo("Hola, ${baz}") // Bien
foo("Hola, mundo") // No se puede asignar un valor de tipo java.lang.String a una variable de tipo groovy.lang.GString
foo("Hola, mundo${""}") // Bien pero feo
¿Existe alguna forma elegante de crear un GString a partir de una cadena?
EDICIÓN
Supongo que he simplificado demasiado mi problema. Estoy utilizando parámetros de constructor con nombre para inicializar objetos. Dado que algunas de las cadenas se evalúan de forma perezosa, necesito almacenarlas como GString
.
class SomeClass {
GString foo
}
new SomeClass(
foo: "Hola, mundo" // Falla
)
Así que la sobrecarga de métodos no es una opción.
La solución, como mencionó willyjoker, es usar CharSequence
en lugar de String
.
class SomeClass {
CharSequence foo
}
new SomeClass(
foo: "Hola, mundo" // Funciona
)
new SomeClass(
foo: "Hola, ${baa}" // También funciona perezosamente
)
davy.ai
Creando un GString a partir de un String en Groovy
Si necesitas invocar un método en Groovy con un parámetro
GString
, pero quieres pasar unString
regular, puedes crear unGString
a partir de unString
utilizando comillas dobles ("
) e incrustando la variable o expresión que deseas evaluar dentro de${}
.Por ejemplo:
Si pasas un
String
regular afoo
, obtendrás un error de compilación, porque el método solo acepta un parámetroGString
.Sin embargo, también puedes crear un
GString
a partir de unString
regular al incrustar una variable vacía dentro de${}
, así:Esto creará un
GString
sin ninguna variable o expresión incrustada, pero aún será reconocido como unGString
por el compilador de Groovy.Utilizando GString con parámetros nombrados en el constructor
Si necesitas utilizar un
GString
con parámetros nombrados en el constructor en Groovy, puedes utilizarCharSequence
en lugar deString
, ya queGString
implementa la interfazCharSequence
.Por ejemplo:
Esto te permitirá almacenar un
GString
como parámetro del constructor, incluso si el valor se evalúa de forma diferida.