Groovy闭包不会采用两个不同的类来实现相同的接口?

时间:2014-01-28 17:46:46

标签: groovy interface closures

我正在通过groovy使用第三方Java API,并且我遇到了我编写的闭包问题。问题出现是因为闭包被编译为具有签名,该签名采用具体类而不是我想要的接口。

因此,我们有两个实现接口A的{​​{1}}和B类。

IInterface有一个名为IInterface的方法。 parentA中任何对象的父级都是B中的对象。 (为简洁起见,我们将忽略到达此树根的问题。)

如果我实施以下内容:

B

然后用static def foo = { IInterface obj -> assert obj.parent() in IInterface foo(obj.parent()) } 中的对象调用它,然后当我希望它递归时会失败,

A

看起来groovy.lang.MissingMethodException: No signature of method: packagename.Runner$__clinit__closure5.foo() is applicable for argument types: (B) values: ... 已经编译为foo()而不是A。我是否正确诊断了这个?我错过了一些明显的东西吗?

为了完整性,IInterface报告“Groovy版本:2.1.6 JVM:1.7.0_09-icedtea供应商:Oracle Corporation操作系统:Linux”。

1 个答案:

答案 0 :(得分:0)

看起来你有同样的问题 Recursion with closures in Groovy 2.1.9

试试这个:

def foo 
foo = { IInterface obj ->
    assert obj.parent() in IInterface
    foo(obj.parent())
}