我只想重写groovy类中构造函数的行为。
class Foo {
def a
def b
Foo(int a, int b) {
this.a = a
this.b = b
println("I'm a Foo!")
}
}
class Bar extends Foo {
Bar(int a, int b) {
this.a = 2*a
this.b = 2*b
println("I'm a Bar!")
}
}
def f = new Foo(1, 2)
def b = new Bar(1, 2)
当我运行这个命令时,def f = new Foo(1, 2)
行成功运行,但是def bar = new Bar(1, 2)
抛出一个异常:
I'm a Foo!
Caught: java.lang.NoSuchMethodError: Foo: method <init>()V not found
java.lang.NoSuchMethodError: Foo: method <init>()V not found
所以我很困惑,我该如何只重写类属性的构造函数呢?
(顺便提一下,IntelliJ抱怨Bar
构造函数的定义,说"在类Foo中没有可用的默认构造函数"),这也让我感到困惑。
- 更新**:
我发现我可以通过在Foo中添加一个无参数构造函数Foo() {}
来解决这个问题,这似乎解决了Bar的问题,但我仍然不知道这里发生了什么。
1条答案
按热度按时间dxxyhpgq1#
groovy基于java,在java中你不能覆盖祖先的构造函数,你只能扩展它。
例如,如果你没有使用
super(a, b)
来指定要扩展哪个构造函数--那么编译器将尝试使用默认的父构造函数super()
--这里你得到了一个原始错误。java.lang.NoSuchMethodError:Foo:未找到方法()V
因此,这个方法应该有效:
结果: