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

如何在groovysh中声明和使用集合数据结构?,groovy,groovysh,Groovy,Groovysh,我试过: groovy:000> Set<String> s = ["a", "b", "c", "c"] ===> [a, b, c] groovy:000> s Unknown property: s 出现此问题的唯一原因是您正在使用GroovyShell测试代码。我不经常使用GroovyShell,但它似乎忽略了类型,例如 Set<String> s = ["a", "b", "c", "c"] 后者当然会创建一个列表。如果您在Groovy控制

我试过:

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

出现此问题的唯一原因是您正在使用GroovyShell测试代码。我不经常使用GroovyShell,但它似乎忽略了类型,例如

Set<String> s = ["a", "b", "c", "c"]
后者当然会创建一个
列表
。如果您在Groovy控制台中运行相同的代码,您将看到它实际上创建了一个
Set

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


Groovy>=2.4.0
在groovy shell中将
explorerMode
设置为
true

:set interpreterMode true
应该解决这个问题

Groovy<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>
groovy:000>s=['a','b','c','c']作为集合
=>[a,b,c]
groovy:000>s
=>[a,b,c]
groovy:000>s.class
=>类java.util.LinkedHashSet
groovy:000>

啊,好的。所以你建议使用控制台来解决这个问题?@smilingcow是的,我不知道为什么Groovy shell会忽略这样的类型,但我倾向于使用控制台来进行此类快速测试GroovySh一点也不有趣<代码>[“a”、“b”、“c”、“c”]设置为使我的单元测试失败,但
[“a”、“b”、“c”、“c”]。toSet()
工作正常。我用的是斯波克。@PatrycjaK我在斯波克也这么想,因为有一点不同:。。。当Set创建LinkedHashSet时,.toSet()创建哈希集。这打破了我的模拟,因为在生产代码中使用了一个键集,它是HashSet的祖先,但不是LinkedHashSet的祖先。你知道为什么GroovyShell似乎忽略了导致本问题中所述误解的类型吗?向变量添加一个类型会使其成为Shell环境中不可用的局部变量@多纳尔
["a", "b", "c", "c"].toSet()
["a", "b", "c", "c"] as Set
:set interpreterMode true
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>