使Groovy代理(来自as-coercion)委托给String()

时间:2017-06-11 16:36:31

标签: groovy coercion

我有一个接口和一个实现接口方法的类,但没有使用implements关键字来实现。因此我使用as - 强制类的实例。到目前为止,这已经按预期工作了,但是toString()没有在代理上调用而不是实际实例。

考虑以下示例:

class CoercionToString {

    public static main(String[] args) {
        A a = new A();
        a.foo();
        println a;

        B b = new A() as B;
        b.foo();
        println b;
    }
}

class A {
    void foo() {
        println "foo"
    }

    @Override
    public String toString() {
        return "bar";
    }
}

interface B {
    void foo()
}

这会产生以下输出:

foo
bar
foo
A1_groovyProxy@197d671

我希望能够覆盖toString(),但与其他方法不同,它不会委托给实际对象。有没有办法让代理对象以这种方式运行?

1 个答案:

答案 0 :(得分:0)

这适用于我使用trait而不是intefrace:

class CoercionToString {

    public static main(String[] args) {
        B b = new A() as B;
        b.foo();
        println b;
        println b.toString();
    }
}

class A {

    void foo() {
        println "foo"
    }

    @Override
    public String toString() {
        return "bar";
    }

}

trait B {
    public abstract void foo()
    public abstract String toString()
}