Вопрос создания массива объектов 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) 

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

и метод вы звоните должен массив. Вы можете создать массив с помощью as:

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

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

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


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

g.message(code: 'UserService.msg.forgot.unknown', args: ["test@mail.com"])