2015-10-15 108 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

相关问题