Groovy。&闭包(方法指针运算符)与{}闭包-MethodMissingException

时间:2019-12-05 17:54:20

标签: groovy closures

我是Groovy的新手,我正在尝试使用Closures和.&方法指针运算符。

为了进一步了解Groovy的工作原理,我设置了以下示例。

我希望isString的所有3个版本都返回true-但是isString3会抛出MethodMissingException,但我不确定我知道{之间的实际区别是什么引起异常的{1}}和isString2

isString3

我尝试在SO周围搜索其他答案,但没有真正找到能解释我在这里看到的实际差异的答案。

3 个答案:

答案 0 :(得分:1)

(不是答案。)

groovy:000> def tmp = java.lang.String.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@92031aba
groovy:000> tmp('hi')
===> true

很酷。

groovy:000> def tmp2 = String.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@99643448
groovy:000> tmp2('hi')
No signature of method: groovysh_evaluate.tmp2() is applicable for argument types: (java.lang.String) values: [hi]
Possible solutions: dump(), wait(), run(), run(), find(), any()

Wat ...

groovy:000> String
===> class java.lang.String
groovy:000> def tmp = String.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@4b3e238d
groovy:000> tmp('hi')
===> true

很酷。

groovy:000> def tmp2 = String.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@3fdea076
groovy:000> tmp2('hi')
No signature of method: groovysh_evaluate.tmp2() is applicable for argument types: (java.lang.String) values: [hi]
Possible solutions: dump(), wait(), run(), run(), find(), any()
groovy:000> def wat = String.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@e3cc658a
groovy:000> wat('hi')
No signature of method: groovysh_evaluate.wat() is applicable for argument types: (java.lang.String) values: [hi]
Possible solutions: wait(), wait(long), wait(long, int), with(groovy.lang.Closure), run(), run()

哎呀。

答案 1 :(得分:1)

将我的代码更改为以下作品:

isString = String.&invokeMethod.curry('isInstance')
isString('foo') // true
// ^ calling isString('foo') is equivalent to calling
// String.invokeMethod('isInstance', 'foo')
isString.class // CurriedClosure
isString instanceof Closure // true

我认为尝试从String类进行关闭是导致问题的原因,但我不确定。

如果有人能发布详细解释问题的答案,我会很高兴!

答案 2 :(得分:1)

您遇到的问题是由于使用String作为类型和类引起的。在 Java 中,String.class是类,而String用于类型。 isInstance方法被定义为Class<String>.isInstance(),而.&试图作为String.isInstance()的(静态)方法来访问它。因此错误

  

没有方法签名:java.lang.String.isInstance()

闭包不会寻找java.lang.String.class.isInstance(),这会起作用。我找不到一种方法,可以通过.&isInstance手动返回此方法,并为true返回String