在Groovy下面的代碼將GString
s到列表:在Groovy
List<String> args = [ 'cmd', "-Dopt=${value}" ]
當我創建這個列表中的ProcessBuilder
,我得到了ClassCastException
。將列表元素強制轉換爲正確類型的常規方法是什麼?
在Groovy下面的代碼將GString
s到列表:在Groovy
List<String> args = [ 'cmd', "-Dopt=${value}" ]
當我創建這個列表中的ProcessBuilder
,我得到了ClassCastException
。將列表元素強制轉換爲正確類型的常規方法是什麼?
或者,你可以這樣做:
List<String> args = [ 'cmd', "-Dopt=${value}"] as String[]
或
List<String> args = [ 'cmd', "-Dopt=${value}"]*.toString()
實際上,爲什麼您使用的ProcessBuilder出於興趣? Groovy的補充方法可以做到process management,甚至增加了三個execute
methods to List
你可以這樣做(這是在OS X或Linux):
def opt = '-a'
println([ 'ls', "$opt" ].execute(null, new File('/tmp')).text)
打印出的文件在我/tmp
文件夾
請注意,兩者都做了太多的工作:第一個將最初的'List'轉換爲'String []'並且返回到'List',第二個創建一個'List'的副本,並在每個元素上調用'toString()'。 –
@Joachim是的,但他們都看起來更清潔(恕我直言),而不是在特定元素的列表中嵌入'toString'(並且它不太可能會遺漏元素) –
非常真實。此外,這非常不可能成爲任何代碼路徑上的關鍵元素。 –
我做了測試:
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%確定這是做到這一點的最好方法。
小提示:我發現'System.out.println(args * .getClass( ))'更容易編寫並生成更好的輸出;-) –
@Joachi m,酷! (或者我應該說,Groovy!) – RonK
我添加了一個有關避免ProcessBuilder的評論(我發佈這個內容,因爲你錯過了它)...它可以爲你節省一些工作:-) –