List 在Groovy中创建字符串列表

List 在Groovy中创建字符串列表,list,groovy,gstring,type-coercion,List,Groovy,Gstring,Type Coercion,Groovy中的以下代码将GStrings添加到列表中: List<String> args = [ 'cmd', "-Dopt=${value}" ] List args=['cmd',“-Dopt=${value}”] 当我用这个列表创建一个ProcessBuilder时,我会得到一个ClassCastException。什么是强制列表元素为正确类型的groovy方法?试试看 List<String> args = [ 'cmd', "-Dopt=${value}

Groovy中的以下代码将
GString
s添加到列表中:

List<String> args = [ 'cmd', "-Dopt=${value}" ]
List args=['cmd',“-Dopt=${value}”]
当我用这个列表创建一个
ProcessBuilder
时,我会得到一个
ClassCastException
。什么是强制列表元素为正确类型的groovy方法?

试试看

List<String> args = [ 'cmd', "-Dopt=${value}".toString() ]
List args=['cmd',“-Dopt=${value}”.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());
将代码稍微更改为:

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%确定这是最好的方法。

或者,你可以:

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

打印出我的
/tmp
文件夹中的文件

注意,两者都做了太多的工作:第一个将初始
列表
转换为
字符串[]
,然后返回到
列表
,第二个创建
列表
的副本,并对每个元素调用
toString()
。@Joachim Yeah,但是它们看起来都比在特定元素的列表中嵌入
toString
更干净(IMHO),这是非常正确的。此外,这不太可能是任何代码路径上的关键元素。
ProcessBuilder
也接受
String[]
-因此第一个替代选项可以替换为:
String[]args=['cmd',“-Dopt=${value}”]作为String[]
@Aaron您可以调用
consumeProcessOutput(OutputStream输出,OutputStream错误)
关于
execute()
返回的对象的次要提示:我发现
System.out.println(args*.getClass())
更易于编写并产生更好的输出;-)@约阿希姆,酷!(或者我应该说,Groovy!)我在我的回答中添加了一条关于完全避免ProcessBuilder的评论(如果您错过了,我将发布此评论)。。。这可能会为您节省一些工作:-)我对Groovy最大的不满之一是它在这种特定情况下不会为您转换类型。编译器知道这些类型,因此它应该能够像将其分配给字符串一样轻松地处理这些类型(
class java.util.ArrayList
class java.lang.String
class java.lang.String
List<String> args = [ 'cmd', "-Dopt=${value}"] as String[]
List<String> args = [ 'cmd', "-Dopt=${value}"]*.toString()
def opt = '-a'

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