class Test {
@TupleConstructor(includeFields=true)
static class TestObject {
private int a = 1;
protected int b = 2;
public int c = 3;
int d = 4;
String s = "s";
}
static main(args) {
print new TestObject(1, 2, 3, 4, '3')
}
}
给我:
Caught: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
at in.ksharma.Test.main(Test.groovy:17)
为什么不生成构造函数?
答案 0 :(得分:3)
如果你这样做:
TestObject.constructors.each {println it}
您将看到@TupleConstructor
已生成以下构造函数:
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int,int,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String)
public in.ksharma.Test$TestObject(in.ksharma.Test,int)
public in.ksharma.Test$TestObject(in.ksharma.Test)
这里有两个问题。
Class.getFields()
的javadoc说明了这一点:返回一个包含
Field
个对象的数组,这些对象反映了所表示的类或接口的所有可访问公共字段 通过这个Class
对象。 数组中的元素 返回的内容未按任何特定顺序排序。
要修复它,请使嵌套类保持静态并使用命名参数表示法:
print new TestObject(a:3, b:3, c:4, d:5, s:'3')