さて、Groovy を使用しているのであれば、メタプログラミングをしてみませんか? :-)
things.metaClass.save = { Map map -> delegate.save( map as BasicDBObject ) }
アイデアは単純です。オブジェクトに新しいメソッドを追加します。これは、Map を受け取り、それに応じて呼び出しをキャストにthings
リダイレクトする save() メソッドです。things.save(BasicDBObject)
必要に応じて、このメソッドを Thing のクラスに直接追加できます。
ThingsClass.metaClass.save = { Map map -> delegate.save( map as BasicDBObject ) }
あなたが説明したことをシミュレートしようとして、次のスクリプトを書きました。
class BasicDBObject extends HashMap { }
class Mongo {
def save(BasicDBObject obj) {
println "saving $obj"
}
}
def mongo = new Mongo()
// here it will fail
try {
mongo.save uno:1, dos:2
assert false
} catch (e) { }
mongo.metaClass.save = { Map map -> delegate.save( map as BasicDBObject ) }
// and here it succeeds ;-)
mongo.save uno:1, dos:2
また、角括弧も括弧も必要ないことに注意してください。コロンは地図のことを教えてくれます
as
を介してオーバーロードできる演算子であるメソッドの場合、コンストラクターのパラメーターとしてマップを渡す.asType(Class)
新しいインスタンスをインスタンス化しようとするため、機能すると思います。BasicDBObject
次のリンクの 316 行目あたりにあります。
https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java