2011-07-06 21 views
3
創建的字符串列表

在Groovy下面的代碼將GString s到列表:在Groovy

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

當我創建這個列表中的ProcessBuilder,我得到了ClassCastException。將列表元素強制轉換爲正確類型的常規方法是什麼?

+0

我添加了一個有關避免ProcessBuilder的評論(我發佈這個內容,因爲你錯過了它)...它可以爲你節省一些工作:-) –

回答

11

或者,你可以這樣做:

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

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

實際上,爲什麼您使用的ProcessBuilder出於興趣? Groovy的補充方法可以做到process management,甚至增加了三個executemethods to List

你可以這樣做(這是在OS X或Linux):

def opt = '-a' 

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

打印出的文件在我/tmp文件夾

+0

請注意,兩者都做了太多的工作:第一個將最初的'List'轉換爲'String []'並且返回到'List',第二個創建一個'List'的副本,並在每個元素上調用'toString()'。 –

+1

@Joachim是的,但他們都看起來更清潔(恕我直言),而不是在特定元素的列表中嵌入'toString'(並且它不太可能會遺漏元素) –

+0

非常真實。此外,這非常不可能成爲任何代碼路徑上的關鍵元素。 –

2

嘗試

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

,因爲以後是GString

1

我做了測試:

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()); 

輸出爲:

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

改變碼位爲:

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()); 

生成此:

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

應該做的伎倆,但我不是100%確定這是做到這一點的最好方法。

+2

小提示:我發現'System.out.println(args * .getClass( ))'更容易編寫並生成更好的輸出;-) –

+0

@Joachi m,酷! (或者我應該說,Groovy!) – RonK