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

时间:2014-01-24 02:01:43

标签: groovy polymorphism variadic-functions

我在我的应用程序中使用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的新手,我可能不会理解这种语言的一些微妙之处。至少,在加载脚本时,这似乎会引发编译器错误。

2 个答案:

答案 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构造函数不匹配。乐趣。