2017-06-11 24 views
1

我有一个接口和一个类,实现接口的方法,但不使用implements关键字来这样做。因此,我使用as - 对班级实例进行压制。这一直按照预期工作,但它并不代表toString(),而是在代理上调用,而不是实际的实例。使Groovy代理(从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 
[email protected] 

我希望能够覆盖toString()却是 - 不像其他方法 - 而不是委托给实际目的。有没有办法让代理对象的行为呢?

回答

0

这个作品我用特质,而不是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() 
} 
+0

使用的接口需要,因为它是一个混合Java和Groovy项目。我现在在需要'toString()'支持的少数情况下明确使用'implements'关键字。 –