Как вы объявляете и используете структуру данных Set в 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 ответа
Решение
Эта проблема возникает только потому, что вы используете Groovy Shell для тестирования своего кода. Я не очень часто использую оболочку Groovy, но она, кажется, игнорирует типы, такие, что
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
Groovy >= 2.4.0
настройка interpreterMode
в true
в отличной оболочке
:set interpreterMode true
должен решить эту проблему
Groovy < 2.4.0
Добавление типа к переменной делает его локальной переменной, недоступной для среды оболочки.
используйте как показано ниже 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>