如何动态覆盖类的“每个” Groovy 中的方法?
Groovy 向 java.lang 添加了each() 和许多其他方法。目的。我不知道如何使用 Groovy 元类来动态替换 Java 类上的默认each()。
我可以看到如何添加新方法:
MyJavaClass.metaClass.myNewMethod = { closure -> /* custom logic */ }
new MyJavaClass().myNewMethod { item -> println item } // runs custom logic
但在覆盖方法时似乎相同的方法不起作用:
MyJavaClass.metaClass.each = { closure -> /* custom logic */ }
new MyJavaClass().each { item -> println item } // runs Object.each()
我做错了什么?如何动态重写 Groovy 中的each()?
Groovy adds each() and a number of other methods to java.lang.Object. I can't figure out how to use the Groovy metaclass to dynamically replace the default each() on a Java class.
I can see how to add new methods:
MyJavaClass.metaClass.myNewMethod = { closure -> /* custom logic */ }
new MyJavaClass().myNewMethod { item -> println item } // runs custom logic
But it seems the same approach doesn't work when overriding methods:
MyJavaClass.metaClass.each = { closure -> /* custom logic */ }
new MyJavaClass().each { item -> println item } // runs Object.each()
What am I doing wrong? How can I dynamically override each() in Groovy?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好吧,我在发布问题后几秒钟就找到了解决方案。我只需要在each() 上显式指定闭包参数的类型:
通过省略类型,我添加了each() 的更通用的重载版本,它接受一个Object 参数,而不是覆盖现有的each()接受闭包参数。
Well I found the solution seconds after posting the question. I just needed to explicitly specify the type of the Closure argument on each():
By leaving out the type, I was adding a more generic overloaded version of each() which accepts an Object argument, rather than overriding the existing each() which accepts a Closure argument.