groovy вызовы методов и параметры - нет подписи метода?

Я пытаюсь понять, что происходит, когда я получаю такие ошибки, как "groovy.lang.MissingMethodException: нет подписи метода: Three.method() применим для типов аргументов:"

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"
}    

person user3120960    schedule 15.10.2015    source источник


Ответы (1)


Я думаю, что вы смешиваете разные концепции... по умолчанию классы groovy имеют два конструктора по умолчанию, по умолчанию без параметров и конструктор на основе карты, который работает следующим образом:

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

Однако в случае методов такого поведения по умолчанию нет, и из-за того, что вы не можете использовать этот тип вызова, и вам нужно соответствовать сигнатуре метода, в вашем случае метод ожидает 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)
// ...

Обратите внимание, что в вашем коде есть еще одна ошибка, вы ошибочно вызываете println внутри method()... используйте это:

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

вместо:

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

Надеюсь это поможет,

person albciff    schedule 15.10.2015
comment
почему вы поставили последние 2 параметра в скобки? - person user3120960; 15.10.2015
comment
@ user3120960 только для того, чтобы показать, что, поскольку параметры в вашем методе не имеют типа, можно установить любой тип, который вы хотите. Если это более понятно, вы можете вместо этого использовать просто строку: three.method(1,'kdk','asasd',2323,'rrr','b') этот вызов имеет 6 параметров, поэтому он соответствует вашей сигнатуре метода. :) - person albciff; 15.10.2015