Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data binding Grails自动将字符串强制到我的一个域类中_Data Binding_Grails_Groovy_Grails Domain Class_Type Coercion - Fatal编程技术网

Data binding Grails自动将字符串强制到我的一个域类中

Data binding Grails自动将字符串强制到我的一个域类中,data-binding,grails,groovy,grails-domain-class,type-coercion,Data Binding,Grails,Groovy,Grails Domain Class,Type Coercion,我有一个域类,如: class MyDomainClass{ String name } 以及一个带有签名的接口,如: BigDecimal doBigThangs(MyDomainClass startHere) 我想这样称呼它 doBigThangs('stuff') 并让它自动将字符串“stuff”共享到相应的MyDomainClass中。这是我尝试过的,但也许我需要使用“asType”或其他什么 ExpandoMetaClass.enableGlobally() String.

我有一个域类,如:

class MyDomainClass{
  String name
}
以及一个带有签名的接口,如:

BigDecimal doBigThangs(MyDomainClass startHere)
我想这样称呼它

doBigThangs('stuff')
并让它自动将字符串“stuff”共享到相应的MyDomainClass中。这是我尝试过的,但也许我需要使用“asType”或其他什么

ExpandoMetaClass.enableGlobally()
String.metaClass.toMyDomainClass = {->MyDomainClass.findByNameLike(delegate)}

您是正确的:您可以通过覆盖
asType
来添加类型转换。您的示例如下所示:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = { Class c ->
    if (c == MyDomainClass) { 
        MyDomainClass.findByNameLike(delegate)
    } else {
        oldAsType.invoke(delegate, c)
    }
}
doBigThangs('stuff' as MyDomainClass)
但是,groovy不会在方法调用时将字符串自动转换为另一种类型。您必须像这样调用您的方法:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = { Class c ->
    if (c == MyDomainClass) { 
        MyDomainClass.findByNameLike(delegate)
    } else {
        oldAsType.invoke(delegate, c)
    }
}
doBigThangs('stuff' as MyDomainClass)

有没有可能使用简单的多态性来处理这个问题?我将尝试最终理解多态性,并让您知道:pIt似乎“多态性”只是意味着“实现一个接口”,这仍然给我留下了一个问题:如何在字符串上实现该接口?谢谢,这正是我想要的。是否有某种方法可以使用类似于
super()
的东西来代替
oldAsType
的东西?我正试图了解所有groovy概念。据我所知,一旦覆盖
asType
元方法,旧方法就会消失,除非保存引用。据我所知,在没有编写“def oldAsType”的情况下,我的崩溃是def只是为了使事情变得本地化。。。奇怪的