Для работы Groovy-анализатора требуется определенная информация, чтобы определить, какой метод выполнить.
Так что если вы напишите:
test('yet', 'another good', anything:'notneeded')
Это переведено на:
test([anything:'notneeded'], 'yet', 'another good')
т.е. все именованные аргументы в стиле параметров (с двоеточием) помещаются в карту и помещаются в начало списка аргументов. Все остальные параметры ставятся после этого.
Итак, Groovy теперь ищет подпись test(Map, String, String)
и правильно находит ваш метод.
Если нет именованного параметра, это преобразование не происходит, и подпись будет test(String, String)
, у которой нет подходящего метода.
Таким образом, решение заключается в создании дополнительного метода, который соответствует вызову без именованных параметров:
def test(some, thing='default value'){
test([:], some, thing)
}
Таким образом поддерживаются как именованные, так и неименованные вызовы.