4

Groovyは、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()を動的にオーバーライドするにはどうすればよいですか?

4

1 に答える 1

8

質問を投稿してから数秒後に解決策が見つかりました。each() で Closure 引数の型を明示的に指定する必要がありました。

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

型を除外することで、Closure 引数を受け入れる既存の each() をオーバーライドするのではなく、Object 引数を受け入れる each() のより一般的なオーバーロード バージョンを追加していました。

于 2010-05-02T16:09:11.143 に答える