web-dev-qa-db-fra.com

Comment spécifier un caractère littéral dans groovy?

Comment puis-je spécifier un caractère littéral dans groovy puisque "a" et "a" donnent une chaîne?

Je ne veux pas déclarer une variable de caractère uniquement à cette fin.

35
Kshitiz Sharma

S'il s'agit d'une variable, vous pouvez également définir le type, par exemple:

import Java.awt.image.*

new BufferedImage( 1, 1, BufferedImage.TYPE_INT_RGB ).with {
    createGraphics().with {

        // Declare the type
        char aChar = 'a'

        // Both ways are equivalent and work
        assert fontMetrics.charWidth( aChar ) == fontMetrics.charWidth( 'a' as char )

        dispose()
    }
}

(Toutes mes excuses pour le long exemple, mais j’ai eu le cerveau gelé et je n’arrivais pas à penser à une fonction Java standard différente qui prend une char) ;-)

Cela va également à l’encontre de la deuxième ligne de la question, mais j’ai pensé l’ajouter par souci

18
tim_yates

L'utilisation du mot clé as permet de créer un littéral de caractère dans Groovy.

'a' as char

Voir la discussion ici à la liste de lecture de Groovy.

53
Kshitiz Sharma

Il existe trois façons d'utiliser les littéraux de caractères dans Groovy:

char c = 'c' /* 1 */
'c' as char  /* 2 */
(char) 'c'   /* 3 */

println Character.getNumericValue(c)           /* 1 */ 
println Character.getNumericValue('c' as char) /* 2 */ 
println Character.getNumericValue((char) 'c')  /* 3 */ 

Si vous affectez un littéral de chaîne tel que 'c' à une variable, Groovy effectue le transtypage de manière implicite (voir/* 1 * /). Si vous voulez utiliser les littéraux de chaîne sans variables, vous devez les convertir en utilisant ... comme caractère ... (voir/* 2 * /) ou ... (caractère) ... (voir/* 3 */).

L'utilisation de littéraux char dans les méthodes sans les lancer n'est pas possible car Groovy n'a que des littéraux String qui doivent être convertis en caractères.

println Character.getNumericValue('c') // compile error
0
Andreas M. Oberheim

Cette réponse est plutôt tardive! Mais juste tombé sur elle et voulait ajouter quelques précisions. 

La réponse la plus précise n’est pas Java, mais Groovy n’a PAS de caractère littéral, mais vous pouvez convertir une chaîne en caractère. Un littéral est une valeur écrite exactement telle qu'elle doit être interprétée, et la nécessité du transtypage de type indique qu'il N'EST PAS vraiment un littéral.

Exemples:

assert 'a'.class != Character.class
assert 'a'.class == String.class
assert ('a' as char).class == Character.class
assert ((char)'a').class == Character.class
char A = 'a'; // implicit coercion of string to char
assert A.class == Character.class

En revanche, groovy et Java prennent en charge les littéraux numériques pour int, long, double et float, mais ne prennent pas en charge le littéral numérique en abrégé.

Exemples:

assert 42.class == Integer.class
assert 42l.class == Long.class
assert 42f.class == Float.class
assert 42d.class == Double.class
assert (42 as Short).class == Short.class
0
MarkE