在groovy中这个方法的返回类型是什么?

Ant*_*ony 16 grails groovy

我有一个这样的方法:

def getInformation ()  {

  return [true, "reason why"]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这个

def (isClear, reason) = getInformation()
Run Code Online (Sandbox Code Playgroud)

有没有办法为这个方法定义一个返回类型,以便在有人通过该方法时更好地阅读?

Eri*_*agt 26

此方法的实际返回类型是Object,因为您使用'def'声明它.这意味着无论您实际返回的对象是什么,它都可以返回任何内容.

以下代码同样有效:

def getInformation ()  {    
  return "this is some information"
}
Run Code Online (Sandbox Code Playgroud)

要么

def getInformation ()  {    
  return 42
}
Run Code Online (Sandbox Code Playgroud)

但该方法的返回类型没有改变.

这里真正的问题是:你为什么选择这样的方法?在我看来,以下内容将使事情变得更加清晰:

Result getInformation() {
     return new Result(success: true, reason: "why")
}
Run Code Online (Sandbox Code Playgroud)

这将使调用者更加清楚,并且您需要创建的唯一内容是一个简单的类:

class Result {
     boolean success
     String reason
}
Run Code Online (Sandbox Code Playgroud)

现在你已经有了一个明确定义的API.我永远不会在方法签名中使用def,因为你在这里面临的问题.


fab*_*ert 8

返回类型将是List,更确切地说是ArrayList,其中包含两个Boolean,String类型的元素

由于泛型List只能是单一类型(在本例中为Object),因此无法定义多种返回类型.


Dón*_*nal 6

有没有办法为这个方法定义一个返回类型,以便在有人通过该方法时更好地阅读?

不是真的,你可以把它改成这样,但也好不到哪里去:

List getInformation ()  {
  return [true, "reason why"]
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以定义分配了返回值的变量的类型,这使得该部分代码更具可读性。

def getInformation ()  {    
  return [true, "reason why"]
}

def (boolean isClear, String reason) = getInformation()    
Run Code Online (Sandbox Code Playgroud)


Mr.*_*Cat 6

安东尼,在你的情况下更好地返回一张地图[isClear:true, reason:"reason why"].然后在你的代码中获取值:

Map getInformation ()  {
  return [isClear:true, reason:"reason why"]
}
...
def result =  getInformation ()
if(result.isClear){
   ...
   result.reason
   ...
}
Run Code Online (Sandbox Code Playgroud)