20

我有这样的方法:

def getInformation ()  {

  return [true, "reason why"]
}

我这样使用

def (isClear, reason) = getInformation()

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

4

4 回答 4

29

此方法的真正返回类型是 Object,因为您使用 'def' 声明了它。这意味着它可以返回任何东西,而不管您实际返回的对象是什么。

以下代码同样有效:

def getInformation ()  {    
  return "this is some information"
}

或者

def getInformation ()  {    
  return 42
}

但是方法的返回类型没有改变。

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

Result getInformation() {
     return new Result(success: true, reason: "why")
}

这将使调用者更加清楚,并且您唯一需要创建的是一个微不足道的类:

class Result {
     boolean success
     String reason
}

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

于 2013-05-02T15:53:25.407 回答
8

Anthony, better in your case to return a map [isClear:true, reason:"reason why"]. Then in your code get values:

Map getInformation ()  {
  return [isClear:true, reason:"reason why"]
}
...
def result =  getInformation ()
if(result.isClear){
   ...
   result.reason
   ...
}
于 2013-05-06T16:36:32.700 回答
8

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

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

于 2013-05-02T15:46:02.870 回答
6

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

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

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

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

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

def (boolean isClear, String reason) = getInformation()    
于 2013-05-03T11:57:40.187 回答