Вопрос о создании объектного массива Groovy

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

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

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

def Object[] args = ["test@mail.com"]
messageSource.getMessage('UserService.msg.forgot.unknown', args, null) 
8
задан Aaron Saunders 21 December 2009 в 17:15
поделиться

2 ответа

Поскольку [" 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 сделал списки более краткими, с побочным эффектом, заключающимся в том, что массивы стали более подробными.

18
ответ дан 5 December 2019 в 08:52
поделиться

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

g.message(code: 'UserService.msg.forgot.unknown', args: ["test@mail.com"])
1
ответ дан 5 December 2019 в 08:52
поделиться