假设有一个这样的方法:someAPI(Integer)
。我有一个班级
class MyClass{
int toInteger(){
0 // just for demo. the value will be generated on the fly
}
public <T> T asType(Class<T> c){
0 // just for demo. the value will be generated on the fly
}
}
MyClass myClass
someAPI(myClass as Integer) // OK but it's more like groovy than DSL
someAPI(myClass) // This is what i want, but it gives me an error: method not found.
我怎样才能让groovy自动为我投射?当然someAPI()
不是我要修改的。
答案 0 :(得分:2)
someApi
方法必须存在于类或接口中。假设类或接口被称为MyOtherClass
,那么您可以这样做:
class MyOtherClass {
void someAPI(Integer i) {println "I is $i"}
}
MyOtherClass.metaClass.someAPI = { i ->
delegate.someAPI(i as Integer)
}
class MyClass {
int toInteger() { 22 }
def asType(Class c) { 22 }
}
现在,这有效:
// this prints "I is 52" as expected because Strings can be cast to Integers
new MyOtherClass().someAPI("52")
// prints "I is 22", which is what MyClass returns when cast to Integer
new MyOtherClass().someAPI(new MyClass())
// Integers will work as expected, prints "I is 77"
new MyOtherClass().someAPI(77)
我所做的是路径拥有someAPI
方法的类型的metaClass,我想让它接受任何东西......注意我添加了一个新的someAPI
,它接受了一个无类型参数...
在将参数转换为someAPI
之后,我通过委派将Integer
的新版本实现为实际的实现,这是您尝试做的事情。
当然,这仅适用于Groovy代码。