假设有这样的方法: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()
不是我要修改的。
最佳答案
someApi
方法必须存在于类或接口(interface)中。假设类或接口(interface)被称为 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
的类型的元类。我想要接受任何东西的方法...请注意我添加了一个新的 someAPI
它需要一个无类型的参数......我实现了
someAPI
的新版本通过在将参数转换为 Integer
后委托(delegate)给实际实现,这就是你想要做的。当然,这只适用于 Groovy 代码。
关于groovy 隐式函数参数类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559761/