getClass()返回不同的类取决于声明为def或env的变量

时间:2019-05-16 09:10:03

标签: groovy

为什么在常规方法中这两个变量之间存在差异?

def x = ["one":["D7D7D7", "D2D2D2"]]
env.y = ["two":["D7D7D7", "D2D2D2"]]

x.getClass() -> returns java.util.LinkedHashMap
y.getClass() -> returns java.lang.String

我需要将变量设置为env和HashMap :)

1 个答案:

答案 0 :(得分:0)

由于您没有告知我们您所处的环境(SoapUi,jenkins,grails等)或实际上没有什么环境,因此实际上没有办法以适当的精度回答您的问题。

话虽如此,举例来说,如何最终实现代码中的行为,可能会出现如下所示的常见现象:

class Env { 
  private String val

  String getY() {
    val
  }

  void setY(String val) {
    this.val = val
  }
}

def env = new Env()

def x = ["one":["D7D7D7", "D2D2D2"]]
env.y = ["two":["D7D7D7", "D2D2D2"]]

env.with { 
  println(x.getClass()) // -> returns java.util.LinkedHashMap
  println(y.getClass()) // -> returns java.lang.String
}

从这段代码中,我们可以立即看到属性y(以常规方式表示为getYsetY方法,并直接使用env.y和{{1 }})的类型为env.y = ...,并且由于我们要分配给变量的类型为String,因此哈希图会自动转换为行env.y = ["two":["D7D7D7", "D2D2D2"]]上的字符串。

这是一种机制的示例,该机制可以使像您一样的代码返回其所做的值。像上面提到的那样,如果不对要在其中执行代码的上下文进行适当的猜测,就不能提供足够的信息来给出更完整的答案。