【问题标题】:Make Groovy proxy (from as-coercion) delegate toString()使 Groovy 代理(来自强制)委托 toString()
【发布时间】:2017-06-11 16:36:31
【问题描述】:

我有一个接口和一个实现接口方法但不使用implements 关键字的类。因此,我在类的实例上使用as-coercion。到目前为止,这已按预期工作,但不适用于在代理而不是实际实例上调用的 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(),但它 - 与其他方法不同 - 没有委托给实际对象。有没有办法让代理对象表现得那样?

【问题讨论】:

    标签: groovy coercion


    【解决方案1】:

    这适用于我使用 trait 而不是接口:

    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()
    }
    

    【讨论】:

    • 需要使用接口,因为它是一个混合的 Java 和 Groovy 项目。我现在在需要toString() 支持的少数情况下明确使用implements 关键字。
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多