Groovy closure赢得';不接受实现同一接口的两个不同类吗?
我正在通过groovy使用第三方JavaAPI,并且在我编写的闭包中遇到了一个问题。问题似乎是,闭包被编译为具有一个签名,该签名采用一个具体的类,而不是我希望它采用的接口 因此,我们有两个类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
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 caseA
和B
表示A或B中任何对象的父对象都是B中的对象。你能给出一个简单的例子来说明这个问题并且我们可以重复吗?@Normal已经指出了真正的问题-这与类型无关-这是递归不起作用。我已将他的答案标记为正确。谢谢-因为我使用的是静态闭包(这只是为了快速完成一点工作),所以您提供的链接中的第二个解决方案(用另一个闭包包装内部)有效。groovyConsole中的快速检查表明,问题仍然存在于2.2.1中。