Groovy closure赢得';不接受实现同一接口的两个不同类吗?

Groovy closure赢得';不接受实现同一接口的两个不同类吗?,groovy,interface,closures,Groovy,Interface,Closures,我正在通过groovy使用第三方JavaAPI,并且在我编写的闭包中遇到了一个问题。问题似乎是,闭包被编译为具有一个签名,该签名采用一个具体的类,而不是我希望它采用的接口 因此,我们有两个类A和B,它们实现接口IInterface IInterface有一个名为parent的方法。A或B中任何对象的父对象都是B中的对象。(为了简洁起见,我们将忽略到达此树的根的问题) 如果我实施以下措施: static def foo = { IInterface obj -> assert obj

我正在通过groovy使用第三方JavaAPI,并且在我编写的闭包中遇到了一个问题。问题似乎是,闭包被编译为具有一个签名,该签名采用一个具体的类,而不是我希望它采用的接口

因此,我们有两个类
A
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
而不是
i接口。我的诊断正确吗?我错过了什么明显的东西吗


为了完整起见,
groovy--version
报告了“groovy版本:2.1.6 JVM:1.7.0\u 09-icedtea供应商:Oracle公司OS:Linux”。

看起来您与

试试这个:

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

你确定
B
实现了
IInterface
?Show case
A
B
表示A或B中任何对象的父对象都是B中的对象。你能给出一个简单的例子来说明这个问题并且我们可以重复吗?@Normal已经指出了真正的问题-这与类型无关-这是递归不起作用。我已将他的答案标记为正确。谢谢-因为我使用的是静态闭包(这只是为了快速完成一点工作),所以您提供的链接中的第二个解决方案(用另一个闭包包装内部)有效。groovyConsole中的快速检查表明,问题仍然存在于2.2.1中。