Как я могу динамически переопределить метод «каждый» класса в Groovy? - PullRequest
4 голосов
/ 02 мая 2010

Groovy добавляет each () и ряд других методов в java.lang.Object. Я не могу понять, как использовать метакласс Groovy для динамической замены each () по умолчанию в классе Java.

Я вижу, как добавить новые методы:

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?

1 Ответ

8 голосов
/ 02 мая 2010

Ну, я нашел решение через несколько секунд после публикации вопроса. Мне просто нужно было явно указать тип аргумента Closure для каждого ():

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

Опуская тип, я добавил более общую перегруженную версию each (), которая принимает аргумент Object, вместо того, чтобы переопределять существующий each (), который принимает аргумент Closure.

...