如何在Groovy中动态覆盖类的“each”方法?

时间:2010-05-02 16:06:59

标签: groovy override each metaclass

Groovy adds each()以及java.lang.Object的许多其他方法。我无法弄清楚如何使用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()?

1 个答案:

答案 0 :(得分:8)

我在发布问题后几秒钟就找到了解决方案。我只需要在each()上明确指定Closure参数的类型:

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

通过省略类型,我添加了一个更通用的each()的重载版本,它接受一个Object参数,而不是覆盖接受Closure参数的现有each()。