如何动态覆盖类的“每个” Groovy 中的方法?

发布于 2024-08-30 21:54:28 字数 614 浏览 7 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原谅我要高飞 2024-09-06 21:54:28

好吧,我在发布问题后几秒钟就找到了解决方案。我只需要在each() 上显式指定闭包参数的类型:

MyJavaClass.metaClass.each = { Closure closure -> /* custom logic */ }
new MyJavaClass().each { item -> println item }  // runs custom logic

通过省略类型,我添加了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():

MyJavaClass.metaClass.each = { Closure closure -> /* custom logic */ }
new MyJavaClass().each { item -> println item }  // runs custom logic

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文