如何在groovysh中声明和使用Set数据结构?

时间:2015-01-08 19:42:52

标签: groovy groovysh

我试过了:

groovy:000> Set<String> s = ["a", "b", "c", "c"]
===> [a, b, c]
groovy:000> s
Unknown property: s

我希望能够将它作为一个集合使用,但即使我明确地传递它,它也会将它变成一个ArrayList:

groovy:000> joinList(["a", "b", "c", "c"])
ERROR groovy.lang.MissingMethodException:
No signature of method: groovysh_evaluate.joinList() is applicable for argument types: (java.util.ArrayList) values: [[a, b, c, c]]
Possible solutions: joinList(java.util.Set)

2 个答案:

答案 0 :(得分:21)

只有在您使用Groovy Shell测试代码时才会出现此问题。我没有太多使用Groovy shell,但似乎忽略了类型,例如

Set<String> s = ["a", "b", "c", "c"]

相当于

def s = ["a", "b", "c", "c"]

后者当然会创建List。如果您在Groovy控制台中运行相同的代码,您会看到它确实创建了Set

Set<String> s = ["a", "b", "c", "c"]
assert s instanceof Set

在Groovy中创建Set的其他方法包括

["a", "b", "c", "c"].toSet()

["a", "b", "c", "c"] as Set

答案 1 :(得分:13)

Groovy&gt; = 2.4.0
通过

在groovy shell中将interpreterMode设置为true
:set interpreterMode true

应解决此问题

Groovy&lt; 2.4.0
向变量添加类型使其成为shell环境无法使用的局部变量。

groovysh

中使用如下
groovy:000> s = ['a', 'b', 'c', 'c'] as Set<String>
===> [a, b, c]
groovy:000> s
===> [a, b, c]
groovy:000> s.class
===> class java.util.LinkedHashSet
groovy:000>