13

我试过了:

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)
4

2 回答 2

46

之所以会出现此问题,是因为您使用 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

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

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

或者

["a", "b", "c", "c"] as Set
于 2015-01-08T19:53:34.400 回答
17

Groovy >= 2.4.0在 groovy shell 中
设置interpreterModetrue

: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>
于 2015-01-08T20:00:37.143 回答