2010-05-02 17 views
4

Groovy adds each() et un certain nombre d'autres méthodes à java.lang.Object. Je n'arrive pas à comprendre comment utiliser la métaclasse Groovy pour remplacer dynamiquement la valeur par défaut each() sur une classe Java.Comment remplacer dynamiquement la méthode "each" d'une classe dans Groovy?

Je peux voir comment ajouter de nouvelles méthodes:

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

Mais il semble que la même approche ne fonctionne pas lorsque les méthodes remplaçant:

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

Qu'est-ce que je fais mal? Comment puis-je redéfinir dynamiquement chaque() dans Groovy?

Répondre

8

Eh bien, j'ai trouvé la solution quelques secondes après avoir posté la question. Je avais juste besoin de spécifier explicitement le type de l'argument de fermeture sur chaque():

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

En laissant le type, j'ajoutais un qui accepte un argument Object version surchargée plus générique de chaque(), plutôt que substitution de l'attribut each() qui accepte un argument Closure.