具有命名参数的TupleConstructor

时间:2013-12-16 19:47:52

标签: groovy

我有这个脚本:

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)

为什么firstName保持为null而lastName具有参数的映射?

我正在使用groovy 1.8.6

1 个答案:

答案 0 :(得分:5)

由于您的字段已声明为def,因此TupleConstructor实际上会添加2个构造函数:

Person( Object first name )

Person( Object firstName, Object secondName )

然后,当你调用map风格的构造函数时,它调用一个arg tuple构造函数,并将map作为参数。

在字段中添加类型应该可以解决此问题

正如docs for TupleConstructor中所述:

  

限制:    - 如果第一个属性(或字段)具有LinkedHashMap类型或者存在单个Map,AbsotractMap或HashMap属性(或字段),则Groovy的常规地图样式命名约定将不可用

相关问题