如何在groovy中调用接受varargs的超级构造函数?

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的新手,我可能不会理解这种语言的一些微妙之处.至少,这似乎应该在加载脚本时抛出编译器错误.

dma*_*tro 8

您可以使用@InheritConstructorsAST来避免此样板代码.

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)