2011-07-06 9 views
3

Groovyで次のコードで文字列のリストを作成し、リストにGString秒を追加します。私はこのリストにProcessBuilderを作成するとGroovyの

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

、私はClassCastExceptionを取得します。リストの要素を正しい型に強制的に変換する魅力的な方法は何ですか?

+0

I内のファイルを出力

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

答えて

11

または、あなたが行うことができます:

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

または

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

、なぜあなたが関心の外にProcessBuilderをを使用していますか? Groovyのはprocess managementを行う方法を追加し、さらにはあなたが行うことができます3 executemethods to List

追加します(これは、OS XやLinux上で):私の/tmpフォルダ

+0

両方ともあまりにも多すぎることに注意してください。最初のものは最初の 'List'を' String [] 'に変換し、それを' List'に変換し、2番目のものは ' Listのコピーも作成し、すべての要素に対して 'toString()'を呼び出します。 –

+1

@Joachimええ、しかし、彼らは特定の要素のリストの中に 'toString'を埋め込むよりももっと洗練されています(IMHO)。 –

+0

は非常に真です。また、これはコードパス上の重要な要素であるとは考えにくいです。 –

2

以降はGStringあるので

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

を試してみてください。

1

Iは、試験をした:

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 

があると、コードを少し変更:

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

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

は、これを生成

トリックを行う必要がありますが、これを実行するには、これが最善の方法であるとは100%確信していません。

+2

マイナーヒント:私は 'System.out.println(args * .getClass()が見つかりませんでした。これは、あなたがそれを見逃した場合にポストしています) )) 'を書くとより良い出力を生成する;-) –

+0

@ジョーチングm、クール! (あるいは、私はGroovyと言うべきでしょうか?) – RonK