Вопрос создания массива Groovy-объекта - PullRequest
8 голосов
/ 21 декабря 2009

почему это вызывает исключение?

messageSource.getMessage('UserService.msg.forgot.unknown', ["test@mail.com"], null) 

если я не сделаю это ...

def Object[] args = ["test@mail.com"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null) 

Ответы [ 2 ]

18 голосов
/ 21 декабря 2009

Поскольку ["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

и вызываемый метод нуждается в массиве. Вы можете создать массив, используя as:

Object[] args = ["asdf"] as Object[]

Создатели Groovy решили сделать структуры данных более высокого уровня, такие как списки, идиоматическими, в то время как для взаимодействия с Java существуют массивы.

В своем интервью в Coders at Work Гай Стил рассказывает о выборе, сделанном при разработке языка:

"Это проблема кодирования Хаффмана. Если вы сделаете что-то сжатое, как следствие, что-то должно быть более многословным. Так в разработка языка, одна из вещей, о которых вы думаете: «Что такое вещи, которые я хочу сделать очень легко сказать и очень легко получить право?' Но с пониманием, что, использовав персонажей или символы для этой цели, вам придется сделать что-то еще немного сложнее сказать. "

Похоже, что Groovy сделал списки более краткими, с побочным эффектом, что массивы стали более многословными.

1 голос
/ 22 декабря 2009

Натан уже (правильно) объяснил причину такого поведения на уровне языка. Я просто хочу подняться на один уровень абстракции вверх: почему вы сначала используете Spring * MessageSource напрямую? В Grails есть тег message , который оборачивает источник сообщения:

g.message(code: 'UserService.msg.forgot.unknown', args: ["test@mail.com"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...