Как вы объявляете и используете структуру данных 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>
Другие вопросы по тегам