我如何重写Groovy类中的构造函数?

vm0i2vca  于 2023-02-03  发布在  其他
关注(0)|答案(1)|浏览(147)

我只想重写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的问题,但我仍然不知道这里发生了什么。

dxxyhpgq

dxxyhpgq1#

groovy基于java,在java中你不能覆盖祖先的构造函数,你只能扩展它。
例如,如果你没有使用super(a, b)来指定要扩展哪个构造函数--那么编译器将尝试使用默认的父构造函数super()--这里你得到了一个原始错误。
java.lang.NoSuchMethodError:Foo:未找到方法()V
因此,这个方法应该有效:

class Foo {
    def a
    def b
    
    String toString(){ "${this.getClass()}[$a, $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) {
        super(a, b)    // <<-- the only change
        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)

println f
println b

结果:

I'm a Foo!
I'm a Foo!    <<-- this is coming from Bar (inherited from Foo)
I'm a Bar!
class Foo[1, 2]
class Bar[2, 4]

相关问题