как исправить groovy.lang.MissingMethodException: Нет сигнатуры метода:

Я пытаюсь использовать этот метод без закрытия

def copyAndReplaceText(source, dest, targetText, replaceText){
    dest.write(source.text.replaceAll(targetText, replaceText))
}

def source = new File('C:/geretd/resumebak.txt') //Hello World
def dest = new File('C:/geretd/resume.txt') //blank

copyAndReplaceText(source, dest){
    it.replaceAll('Visa', 'Passport!!!!')
}

но когда я его запускаю, я получаю следующую ошибку:

groovy.lang.MissingMethodException: No signature of method: ConsoleScript3.copyAndReplaceText() is applicable for argument types: (java.io.File, java.io.File, ConsoleScript3$_run_closure1) values: [C:\geretd\resumebak.txt, C:\geretd\resume.txt, ...]
Possible solutions: copyAndReplaceText(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)

at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)

at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78)

at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)

Что я делаю не так?

Ответ 1

Потому что вы передаете три аргумента методу из четырех аргументов. Кроме того, вы не используете пройденное закрытие.

Если вы хотите указать операции, которые должны выполняться поверх source содержимого, используйте закрытие. Это было бы примерно так:

def copyAndReplaceText(source, dest, closure){
    dest.write(closure( source.text ))
}

// And you can keep your usage as:
copyAndReplaceText(source, dest){
    it.replaceAll('Visa', 'Passport!!!!')
}

Если вы всегда будете менять строки, пройдите оба, поскольку ваша сигнатура метода уже заявляет:

def copyAndReplaceText(source, dest, targetText, replaceText){
    dest.write(source.text.replaceAll(targetText, replaceText))
}

copyAndReplaceText(source, dest, 'Visa', 'Passport!!!!')

Ответ 2

Это также может быть связано с тем, что вы, возможно, дали имя класса со всеми буквами в нижнем регистре, которые не поддерживаются groovy (знаю версию 2.5.0).

имя класса - Пользователь принимается, но пользователь - нет.

Ответ 3

Вы также можете получить эту ошибку, если объекты, которые вы передаете методу, вышли из строя. Другими словами, ваш метод берет по порядку строку, целое число и дату. Если вы передадите дату, затем строку, затем целое число, вы получите то же сообщение об ошибке.