【问题标题】:Grails automatically coerce strings into one of my domain classesGrails 自动将字符串强制转换为我的域类之一
【发布时间】:2012-02-29 08:16:50
【问题描述】:

我有一个类似的域类:

class MyDomainClass{
  String name
}

还有一个带有如下签名的接口:

BigDecimal doBigThangs(MyDomainClass startHere)

我希望能够这样称呼它

doBigThangs('stuff')

并让它自动将字符串“stuff”强制转换为适当的 MyDomainClass。这是我尝试过的,但也许我需要使用“asType”之类的东西。

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

【问题讨论】:

  • 是否可以使用简单的多态性来处理这个问题?
  • 我会去尝试最终理解多态性并告诉你:p
  • 似乎“多态性”只是意味着“实现一个接口”,这仍然给我留下了一个问题:如何在 String 上实现该接口?

标签: data-binding grails groovy grails-domain-class type-coercion


【解决方案1】:

您是对的:您可以通过覆盖 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)
    }
}

但是,groovy 不会在方法调用时默默地将 String 强制转换为另一种类型。您必须像这样调用您的方法:

doBigThangs('stuff' as MyDomainClass)

【讨论】:

  • 谢谢,这正是我想要的。有什么方法可以使用super() 之类的东西而不是oldAsType 的东西吗?我正在努力理解所有时髦的概念。
  • 据我所知,一旦你覆盖了asType 元方法,除非你保存了引用,否则旧的就消失了。
  • 我的崩溃没有写“def oldAsType”,据我了解,def 只是为了让事情变得本地......很奇怪。
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多