如何在 Groovy 中动态覆盖类的“each”方法?
Posted
技术标签:
【中文标题】如何在 Groovy 中动态覆盖类的“each”方法?【英文标题】:How can I dynamically override a class's "each" method in Groovy? 【发布时间】:2011-02-14 19:00:53 【问题描述】: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】:好吧,我在发布问题后几秒钟就找到了解决方案。我只需要在 each() 上明确指定闭包参数的类型:
MyJavaClass.metaClass.each = Closure closure -> /* custom logic */
new MyJavaClass().each item -> println item // runs custom logic
通过省略类型,我添加了一个更通用的 each() 的重载版本,它接受一个 Object 参数,而不是覆盖现有的 each() 接受一个 Closure 参数。
【讨论】:
以上是关于如何在 Groovy 中动态覆盖类的“each”方法?的主要内容,如果未能解决你的问题,请参考以下文章
Groovy集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )