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 は 2 つの引数を想定していますが、指定したマップは 1 つの引数しかないため、このコードは実行時に失敗します。

それが私が直面しているエラーの原因であるかどうかはわかりません。不足している引数は何か、または2番目の引数を渡すにはどうすればよいかというような2つの引数が必要な場合は?

4

1 に答える 1

11

次のように、名前付き引数を使用して関数を呼び出します。

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

[id:10,instanceId:20,isValid:true]は、関数にである1 つのパラメーターのみを渡すことを意味します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)

2 番目のパラメーターを渡すには、次のように、呼び出し時にパラメーターをもう 1 つ追加する必要があります。

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 に答える