2013-12-16 2 views
5

У меня есть этот скрипт:TupleConstructor с именованными параметрами

def person = new Person(lastName: "foo", firstName: "bar") 

println person 

@groovy.transform.TupleConstructor 
@groovy.transform.ToString(includeNames = true, includeFields=true) 
class Person 
{ 
    def lastName 
    def firstName 
} 

почему она дает мне:

Person(lastName:[lastName:foo, firstName:bar], firstName:null) 

Почему ПгвЬЫате остается пустой и LastName имеет карту параметров?

Я использую заводной 1.8.6

+0

Я предполагаю, что это работает, если вы объявляете свои свойства как 'String', а не с' de f'? –

+0

@tim_yates да, это так, но почему? – res1

+0

Добавлен ответ, который, я надеюсь, объясняет это –

ответ

5

Потому что вы ваши поля объявлены как def, то TupleConstructor эффективно добавлять 2 конструктора:

Person(Object first name) 

И

Person(Object firstName, Object secondName) 

Тогда, когда вы вызываете конструктор стиля карты, он вызывает один конструктор arg tuple с картой в качестве параметра.

Добавление типов в ваши поля следует удалить этот вопрос

Как говорится в docs for TupleConstructor:

Ограничения: - нормальные соглашения карты стиля именования Groovy не будут доступны, если первое свойство (или поле) имеет тип LinkedHashMap или если имеется одна карта, свойство AbsotractMap или HashMap (или поле)

Смежные вопросы