好吧,如果您在使用 Groovy,为什么不进行一些元编程呢?:-)
things.metaClass.save = { Map map -> delegate.save( map as BasicDBObject ) }
这个想法很简单:我们在things
对象上添加一个新方法,它是一个 save() 方法,它接收一个 Map 并将调用重定向到相应的things.save(BasicDBObject)
转换。
如果需要,可以直接将此方法添加到事物的类中:
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