2015-10-15 208 views
0

我想明白髮生了什麼,當我得到這樣的錯誤「groovy.lang.MissingMethodException:法無簽名:Three.method()的參數類型是適用的:」groovy方法調用和參數 - 沒有方法的簽名?

b = "Tea" 

class Three 
{ 
    String myVar1, myVar2, myVar3, myVar4, myVar5, myVar6 
    def method(myVar1,myVar2,myVar3,myVar4,myVar5,myVar6) 
    { 
     try { 
      println myVar1, myVar2, myVar3, myVar4, myVar5, myVar6 
     } catch (groovy.lang.MissingPropertyException e) { 
      println "error caught" 
     } 
    } 

} 
try { 
    new Three().method(myVar1:b); 
} catch (groovy.lang.MissingPropertyException e) { 
    println "error caught" 
} 

try { 
    new Three().method(myVar1=b); 
} catch (groovy.lang.MissingPropertyException e) { 
    println "error caught" 
} 

try { 
    new Three().method(b); 
} catch (groovy.lang.MissingPropertyException e) { 
    println "error caught" 
}  

回答

0

我認爲,你是混合不同的概念......在默認情況下Groovy類有兩個默認的構造函數,沒有PARAMS默認和基於地圖的構造,其工作原理如下:

def three = new Three(myVar1:'a',myVar2:'b',myVar3:'c') 
println three.myVar1 // prints a 
println three.myVar2 // prints b 
println three.myVar3 // prints c 

然而,在這些方法的情況下,有ISN」這個默認的行爲,由於你不能使用這種類型的調用,你必須適應的簽名方法,在你的情況下,該方法需要6個參數,而你試圖通過地圖調用它,這就是爲什麼你會得到一個missingMethodException,因爲在你的類中沒有這個簽名的方法。

你的情況,你只有一個方法method()有6個參數與不隱式類型,所以你已經調用它是這樣的:

three.method(1,'kdk','asasd',2323,'rrr',['a','b']) 
// or like this 
three.method(1,'kdk','asasd',2323,'rrr','b') 
// or like this 
three.method(1,2,3,4,5,6) 
// ... 

注意,在你的代碼中有另一個錯誤,您正在調用錯誤裏面method()println ...使用:

println "$myVar1 $myVar2 $myVar3 $myVar4 $myVar5 $myVar6" 

代替:

println myVar1, myVar2, myVar3, myVar4, myVar5, myVar6 

希望這有助於,

+0

爲什麼你把最後2個參數放在括號裏? – user3120960

+0

@ user3120960只是爲了表明由於方法中的參數沒有類型,所以可以設置任何你想要的類型。如果是更清晰,你可以簡單地使用字符串而不是:'three.method(1,「KDK」,「asasd」,2323「存款準備金率」,「B」)'此調用6個參數,以便它適合你的方法簽名。 ':)' – albciff

相關問題