groovy隐式函数参数类型转换

时间:2016-06-01 04:58:44

标签: groovy

假设有一个这样的方法: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()不是我要修改的。

1 个答案:

答案 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代码。