Groovy can';找不到与我的参数匹配的方法

Groovy can';找不到与我的参数匹配的方法,groovy,gradle,Groovy,Gradle,我被Groovy方法解析问题弄糊涂了 我正在为Gradle自定义插件编写Groovy代码 我的任务类的方法中有以下代码: if (inspectDependencies) { project.configurations[yangFilesConfiguration].files.each { File file -> println file println "filetype:${file.getClass().g

我被Groovy方法解析问题弄糊涂了

我正在为Gradle自定义插件编写Groovy代码

我的任务类的方法中有以下代码:

    if (inspectDependencies) {
        project.configurations[yangFilesConfiguration].files.each { File file ->
            println file
            println "filetype:${file.getClass().getName()} excludeFilesType:${excludeFiles.getClass().getName()}"
            this.getYangFilesFromZip(file, excludeFiles).each { File yangFile
                println yangFile
            }
        }
    }
    private Collection<File> getYangFilesFromZip(File file, Collection<String> excludeFiles) {
    ....
稍后在同一任务类中,我还有一个方法定义:

    if (inspectDependencies) {
        project.configurations[yangFilesConfiguration].files.each { File file ->
            println file
            println "filetype:${file.getClass().getName()} excludeFilesType:${excludeFiles.getClass().getName()}"
            this.getYangFilesFromZip(file, excludeFiles).each { File yangFile
                println yangFile
            }
        }
    }
    private Collection<File> getYangFilesFromZip(File file, Collection<String> excludeFiles) {
    ....
如您所见,参数的实际类型与方法的形式参数兼容。这里会出什么问题

更新

我在第一个println和对“getYangFilesFromZip”的调用之间添加了以下行:

当我运行它时,它会打印:

this[task ':yangGenerate'] owner[task ':yangGenerate'] delegate[task ':yangGenerate']
我还尝试了调用本身的变体,包括“getYangFilesFromZip”、“this.getYangFilesFromZip”和“owner.getYangFilesFromZip”。我甚至尝试在闭包之前声明一个“YangGenerate”变量,并从“this”赋值,然后引用该变量,而不是其他变量。没有变化

更新

下面是一个得到相同错误的最小测试用例:

import java.io.File;
import java.util.Collection;

class ResolutionProblem {
    static main(args) {
        Collection<String>  list = ["a", "b", "c", "d"];
        if (args.length > 0) {
            File    file = new File(".")
            list.each {
                owner.getYangFilesFromZip(file, list)
            }
        }
    }

    private Collection<File> getYangFilesFromZip(File file, Collection<String> excludeFiles) {
    }
}
导入java.io.File;
导入java.util.Collection;
类解析问题{
静态干管(args){
收集清单=[“a”、“b”、“c”、“d”];
如果(args.length>0){
文件=新文件(“.”)
列出每个{
owner.getYangFilesFromZip(文件,列表)
}
}
}
私有集合getYangFilesFromZip(文件文件,集合排除文件){
}
}
它应该是:

import java.io.File;
import java.util.Collection;

class ResolutionProblem {
    static main(args) {
        Collection<String> list = ["a", "b", "c", "d"];
        File file = new File(".")
        list.each {
           new ResolutionProblem().getYangFilesFromZip(file, list)
        }
    }

    public Collection<File> getYangFilesFromZip(File file, Collection<String> excludeFiles) {
        println(file)
        println(excludeFiles)
    }
}
导入java.io.File;
导入java.util.Collection;
类解析问题{
静态干管(args){
收集清单=[“a”、“b”、“c”、“d”];
文件=新文件(“.”)
列出每个{
新的解决方案问题().getYangFilesFromZip(文件,列表)
}
}
公共集合getYangFilesFromZip(文件文件,集合排除文件){
println(文件)
println(不包括文件)
}
}

如果不创建声明了该类的对象,就不可能从static块调用私有方法
getYangFilesFromZip
。您应该创建对象或将方法签名更改为静态。

第一眼看到的是this、owner、delegate,请参见此处:。我猜在方法调用之前的
this
不等于任务的
this
。它可以很容易地检查。好的,好主意,但它在这里不成功。我更新了更多信息。是否有完整的、可运行的示例要复制?好的,看起来我在下一次更新中添加的独立测试用例演示了这一点。忘记实例化对象是独立测试中刚刚出现的一个愚蠢错误。当我注释掉可疑电话时,我应该确保测试没有失败,而我忽略了这么做。实际上解决这个问题的方法是将“getYangFilesFromZip”的访问级别更改为非私有级别(使其包受保护)。我习惯于用Java为匿名内部类伪造“合成访问器”,所以我没有想到这是个问题因此,请准备一个真正再现问题的例子。如果需要提供gradle示例,请提供它。Hmph。生成测试用例的问题比我想象的要多。Groovy在从闭包中调用私有方法方面没有问题。删除real method上的访问规范修复了我原来的问题,但我仍然无法用测试用例重新创建它。@DavidM.Karr,如果这个答案对您有帮助,请接受它。