我是Groovy的新手,我正在尝试使用Closures和.&
方法指针运算符。
为了进一步了解Groovy的工作原理,我设置了以下示例。
我希望isString
的所有3个版本都返回true
-但是isString3
会抛出MethodMissingException
,但我不确定我知道{之间的实际区别是什么引起异常的{1}}和isString2
。
isString3
我尝试在SO周围搜索其他答案,但没有真正找到能解释我在这里看到的实际差异的答案。
答案 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
。