2016-06-01 115 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代碼。