почему это выдает исключение?
messageSource.getMessage('UserService.msg.forgot.unknown', ["test@mail.com"], null)
если я не делаю это...
def Object[] args = ["test@mail.com"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null)
Поскольку [" test@mail.com "] оценивается как ArrayList, а не как массив:
groovy:000> o = ["asdf"]
===> [asdf]
groovy:000> o.getClass()
===> class java.util.ArrayList
OTOH, ваше объявление создает массив объектов:
groovy:000> Object[] args = ["asdf"]
===> [Ljava.lang.Object;@14e113b
и метод, который вы для вызова нужен массив. Вы можете создать массив, используя как
:
Object[] args = ["asdf"] as Object[]
Создатели Groovy решили сделать структуры данных более высокого уровня, такие как списки, идиоматическими, в то время как массивы присутствуют для взаимодействия с Java.
В своем интервью в Кодеры за работой Гай Стил говорит о выборе, сделанном при разработке языка:
«Есть проблема с кодировкой Хаффмана. Если вы сделаете что-то краткое, как следствие, кое-что должно быть более подробным. Так что в при разработке языка одна из вещей, о которых вы думаете: «Что такое то, что я хочу, очень легко сказать и очень легко получить право?' Но с пониманием того, что, израсходовав символы или символы для этой цели, вам нужно будет сделать что-то еще немного сложнее сказать. "
Похоже, Groovy сделал списки более краткими, с побочным эффектом, заключающимся в том, что массивы стали более подробными.
Натан уже (правильно) объяснил причину такого поведения на языковом уровне. Я просто хочу поднять один уровень абстракции вверх: Почему вы используете Spring's MessageSource
напрямую? В Grails есть message
tag, который обёртывает источник сообщения:
g.message(code: 'UserService.msg.forgot.unknown', args: ["test@mail.com"])