我有像这样的groovy方法
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,..]]
我去了page以进一步理解这个概念,我看到了这段片段。
如果def foo(T t, p1, p2, ..., pn)
所有命名参数都在t中,但这也意味着您不能在按名称访问pi的位置进行方法调用。实施例
def foo(x,y){}
foo(x:1,y:2)
此代码在运行时将失败,因为方法foo需要两个参数,但您提供的映射只有一个参数。
我不确定这是否是我所面临的错误的原因。如果它期望两个类似的参数说明我缺少的参数是什么,或者我如何传递第二个参数?
答案 0 :(得分:9)
使用如下命名参数调用函数:
def testObj = createMyObj(id:10,instanceId:20,isValid:true)
表示您只将一个[id:10,instanceId:20,isValid:true]
参数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"