2016-06-01 85 views
2

假设有一个像这样的方法:someAPI(Integer)。我有一个班groovy隐函数参数类型转换

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

如果答案对您有帮助,请务必“接受”它。 – Renato

回答

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方法类型的元类,其我想接受任何东西......请注意,我添加了一个新的someAPI它需要一个无类型的参数...

我实现了新版本someAPI委托在将参数投射到Integer之后的实际实现中,这是您正在尝试执行的操作。

当然,这只适用于Groovy代码。