具有命名参数的TupleConstructor

res*_*es1 5 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  
}
Run Code Online (Sandbox Code Playgroud)

为什么它给了我:

Person(lastName:[lastName:foo, firstName:bar], firstName:null)
Run Code Online (Sandbox Code Playgroud)

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

我正在使用groovy 1.8.6

tim*_*tes 5

因为您将字段声明为def,所以TupleConstructor有效地添加了2个构造函数:

Person( Object first name )
Run Code Online (Sandbox Code Playgroud)

Person( Object firstName, Object secondName )
Run Code Online (Sandbox Code Playgroud)

然后,当您调用地图样式构造函数时,它调用一个arg元组构造函数,并将map作为参数.

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

正如它在TupleConstructor文档中所说:

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