我正在通过groovy使用第三方Java API,并且我遇到了我编写的闭包问题。问题出现是因为闭包被编译为具有签名,该签名采用具体类而不是我想要的接口。
因此,我们有两个实现接口A
的{{1}}和B
类。
IInterface
有一个名为IInterface
的方法。 parent
或A
中任何对象的父级都是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”。
答案 0 :(得分:0)
看起来你有同样的问题 Recursion with closures in Groovy 2.1.9
试试这个:
def foo
foo = { IInterface obj ->
assert obj.parent() in IInterface
foo(obj.parent())
}