Yon*_*ree 3 polymorphism groovy variadic-functions
我在我的应用程序中使用groovy作为扩展语言.脚本扩展的类的构造函数接受变量参数.当我尝试实例化groovy类时,我从super()
构造函数中的调用中获得了java.lang.ArrayIndexOutOfBoundsException .可以在独立的groovy脚本中轻松复制该问题:
// problem.groovy
class A {
A(float ... more) {}
}
class B extends A {
B() {
super();
}
}
new B();
Run Code Online (Sandbox Code Playgroud)
运行时,会产生:
$ groovy problem.groovy
Caught: java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
at B.<init>(problem.groovy:7)
at problem.run(problem.groovy:11)
Run Code Online (Sandbox Code Playgroud)
第7行是super()
课堂上的电话B
.
这是语言本身的错误吗?我在网上找不到任何其他的提及.我是Groovy的新手,我可能不会理解这种语言的一些微妙之处.至少,这似乎应该在加载脚本时抛出编译器错误.
您可以使用@InheritConstructors
AST来避免此样板代码.
class A {
A(float ... more) {}
}
@groovy.transform.InheritConstructors
class B extends A {}
new B()
Run Code Online (Sandbox Code Playgroud)
此外,在您的示例中,您不会在A中提供默认构造函数(因为它正在被重载),然后super()
在B的构造函数中使用.或者将重载的构造函数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
Run Code Online (Sandbox Code Playgroud)