6

我有一个像这样的常规方法

def createMyObj(id,instanceId,isValid) {

   def myObj = new SomeObj()
   myObj.setId(id)
   myObj.setInstanceId(instanceId)
   myObj.isValid(isValid)

   myObj

}

当我在测试中明确执行此操作时,我对此进行了测试,它工作得非常好。

def testObj = createMyObj(10,20,true)

当我尝试使用这样的命名参数时。

def testObj = createMyObj(id:10,instanceId:20,isValid:true)

它给了我这个例外

 No signature of method:createMyObj is applicable for argument types: (java.util.LinkedHashMap) values [[id:10, instanceId:20,..]]

我去了这个页面进一步了解这个概念,我看到了这段片段。

如果def foo(T t, p1, p2, ..., pn)所有命名参数都在 t 中,但这也意味着您不能在按名称访问 pi 的地方进行方法调用。例子

def foo(x,y){}
foo(x:1,y:2)

此代码将在运行时失败,因为方法 foo 需要两个参数,但您提供的映射只有一个参数。

我不确定这是否是我面临的错误的原因。如果它需要两个参数,就像它说我缺少的参数是什么或者我如何传递第二个参数?

4

1 回答 1

11

使用命名参数调用函数,如下所示:

def testObj = createMyObj(id:10,instanceId:20,isValid:true)

意味着您只向函数传递了一个参数,[id:10,instanceId:20,isValid:true]即 a LinkedHashMap

显然,createMyObj(id, instanceId, isValid) 需要 3 个参数。所以你得到这个例外是可以的:

No signature of method:createMyObj is applicable for argument types: (java.util.LinkedHashMap) values [[id:10, instanceId:20,..]]

对于后一种情况:

def foo(x,y){}
foo(x:1,y:2)

为了传递第二个参数,您只需要在调用时再添加一个参数,如下所示:

def foo(x,y){}
foo(x:1,y:2,"newParameter")

在这种情况下foo得到

  • x作为[x:1, y:2](这是一个LinkedHashMap
  • y作为"newParameter"
于 2013-05-23T23:59:33.263 回答