我在我的应用程序中使用groovy作为扩展语言。脚本扩展的类的构造函数接受变量参数。当我尝试实例化groovy类时,我从构造函数中的super()
调用中获得了java.lang.ArrayIndexOutOfBoundsException。这个问题很容易在一个独立的groovy脚本中重现:
// problem.groovy
class A {
A(float ... more) {}
}
class B extends A {
B() {
super();
}
}
new B();
运行时,会产生:
$ groovy problem.groovy
Caught: java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
at B.<init>(problem.groovy:7)
at problem.run(problem.groovy:11)
第7行是课程super()
中的B
来电。
这是语言本身的错误吗?我无法在网上找到任何其他的提及。我是Groovy的新手,我可能不会理解这种语言的一些微妙之处。至少,在加载脚本时,这似乎会引发编译器错误。
答案 0 :(得分:8)
您可以使用@InheritConstructors
AST来避免此样板代码。
class A {
A(float ... more) {}
}
@groovy.transform.InheritConstructors
class B extends A {}
new B()
此外,在您的示例中,您不会在A中提供默认构造函数(因为它正在被重载),然后在B的构造函数中使用super()
。或者将重载的构造函数args初始化为null
。
class A {
A(){println 'default'}
//Or use A(float... more = null) {println 'varargs'}
//instead of default constructor
A(float... more) {println 'varargs'}
}
class B extends A {
B(){
super()
}
}
new B()
//Uses default constructor A() if overloaded
//constructor is not initialized to null
答案 1 :(得分:0)
它似乎是用super()调用一个不存在的构造函数 - 甚至用null调用它或者在A中放置一个无arg构造函数并且它有效。 似乎超类上的变量arg构造函数不匹配。乐趣。