【问题标题】:groovy "with" block usage querygroovy "with" 块使用查询
【发布时间】:2011-09-08 07:56:32
【问题描述】:

我正在尝试使用 Groovy 中的 with 块来轻松初始化我的课程,但我收到以下错误。谁能告诉我我做错了什么?

MyXMLTemplate template = new MyXMLTemplate ().with {
    TxId = 'mnop'
    oapTxId = 'abcd'
}

我得到的错误是:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'abcd' with class 'java.lang.String' to class 'org.example.MyXMLTemplate'
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:331)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:599)

我正在使用 groovy 1.8.0

【问题讨论】:

    标签: groovy


    【解决方案1】:

    您需要从with 块中返回模板本身:

    MyXMLTemplate template = new MyXMLTemplate ().with {
        TxId = 'mnop'
        oapTxId = 'abcd'
        it
    }
    

    【讨论】:

    • 是的,这行得通!但是文档没有这个...:(
    • 文档的哪一页? Groovy 的主站点是一个 wiki,因此可以更改为正确的 :-)
    • 我应该说“Javadoc”。我已经下载了源代码,并且在鼠标悬停时得到了这个不完整的文档。-> 这通常用于简化对象创建,例如这个例子: def p = new Person().with { firstName = 'John' lastName = 'Doe ' }
    • 是的,它不会崩溃,因为它使用def 作为p 变量,但它确实将p 设置为字符串Doe 而不是Person 对象......只是checked the docs for 1.8.2,它确实显示必须返回 it 变量,所以也许这是最近修复的问题?
    • 从 Groovy 2.5 开始可以使用tap() 方法,所以不需要返回it;见dzone.com/articles/…
    【解决方案2】:

    如果不查看您的类的定义,就很难看出问题所在。我假设TxIdoapTxId 都是该类的属性。

    我怀疑您的错误是由 oapTxId 的类型为 MyXMLTemplate 引起的,因此无法从 String 分配。

    顺便说一句,由于您的 with 块只是初始化类属性,您可以使用更惯用的构造函数和设置方法:

    MyXmlTemplate template = new MyXMLTemplate(TxId: 'mnop', oapTxId : 'abcd')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 2020-12-14
      • 2018-06-11
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多