groovy 隐式函数参数类型转换

标签 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()不是我要修改的。

最佳答案

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/

相关文章:

grails - 导入用于 grails 脚本 _Events.groovy 的类

groovy - 是否可以使用 mixin 在 spock 的规范之间共享设置/清理 block ?

groovy - 在 Websphere 上的 Groovy 中加载外部 jar

java - 使用 groovy AST Transform 修改 java

svn - grails 将 svn 修订添加到 app.version

Elasticsearch 检查对象中是否存在键

java - 使用具有多对多关系的 Grails 的 withCriteria 函数的重复问题

grails - 将值从Grails Controller 传递到src/groovy中的类

java - 如何使用gradle API检查工件的存在?

json - 想要 Groovy MarkupBuilder() 等同于对象的 JSONBuilder()