2011-07-06 3 views
3

Le code suivant dans Groovy ajoute GString s à la liste:Créer liste de chaînes en Groovy

List<String> args = [ 'cmd', "-Dopt=${value}" ] 

Lorsque je crée un ProcessBuilder avec cette liste, je reçois un ClassCastException. Quelle est la manière géniale de contraindre les éléments de la liste au bon type?

+0

I ajout d'un commentaire sur l'évitement de ProcessBuilder à ma réponse (je poste ce cas, vous l'avez manqué) ... Cela pourrait vous faire économiser du travail :-) –

Répondre

11

Ou, vous pouvez faire:

List<String> args = [ 'cmd', "-Dopt=${value}"] as String[] 

ou

List<String> args = [ 'cmd', "-Dopt=${value}"]*.toString() 

fait, pourquoi utilisez-vous ProcessBuilder par intérêt? Groovy ajoute façons de le faire process management, et ajoute même trois executemethods to List

Vous pouvez le faire (ce qui est sur OS X ou Linux):

def opt = '-a' 

println([ 'ls', "$opt" ].execute(null, new File('/tmp')).text) 

qui imprime les fichiers dans mon /tmp dossier

+0

Notez que les deux font un peu trop de travail: Le premier convertit l'initiale 'List' en un' String [] 'et que retour à un' List', le second crée un Copiez également la 'List' et appelez' toString() 'sur chaque élément. –

+1

@Joachim Oui, mais ils ont tous deux l'air plus propre (IMHO) que d'intégrer 'toString' dans la liste sur des éléments spécifiques (et il est moins probable que vous avez manqué un élément) –

+0

très vrai. En outre, il est hautement * improbable que ce soit l'élément critique sur n'importe quel chemin de code. –

2

Essayez

List<String> args = [ 'cmd', "-Dopt=${value}".toString() ] 

parce que le dernier est un GString.

1

J'ai fait un test:

def value = "abc" 
List<String> args = [ 'cmd', "-Dopt=${value}"]; 

System.out.println (args.getClass()); 

System.out.println (args.get(0).getClass()); 
System.out.println (args.get(1).getClass()); 

La sortie était:

class java.util.ArrayList 
class java.lang.String 
class org.codehaus.groovy.runtime.GStringImpl 

Modification du code un peu à:

def value = "abc" 
List<String> args = [ 'cmd', "-Dopt=${value}".toString()]; 

System.out.println (args.getClass()); 

System.out.println (args.get(0).getClass()); 
System.out.println (args.get(1).getClass()); 

produit ceci:

class java.util.ArrayList 
class java.lang.String 
class java.lang.String 

Devrait faire l'affaire, mais je ne suis pas sûr à 100% que c'est la meilleure façon de le faire.

+2

Indice mineur: je trouve 'System.out.println (args * .getClass ()) 'être plus facile à écrire et à produire une sortie plus agréable ;-) –

+0

@Joachi m, Cool! (ou devrais-je dire, Groovy!) – RonK