gpt4 book ai didi

groovy - 如何在groovy中调用接受可变参数的 super 构造函数?

转载 作者:行者123 更新时间:2023-12-02 02:54:01 28 4
gpt4 key购买 nike

我在我的应用程序中使用 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 行是 B 类中的 super() 调用。

这是语言本身的错误吗?我在网上找不到任何其他提及它的信息。我是 Groovy 的新手,我很可能不理解该语言的一些微妙之处。至少,加载脚本时似乎应该引发编译器错误。

最佳答案

您可以使用@InheritConstructors AST 以避免此样板代码。

class A {
A(float ... more) {}
}

@groovy.transform.InheritConstructors
class B extends A {}

new B()

此外,在您的示例中,您是否不会在 A 中提供默认构造函数(因为它正在重载),然后在 B 的构造函数中使用 super() 。或者将重载的构造函数参数初始化为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

关于groovy - 如何在groovy中调用接受可变参数的 super 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323046/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com