Groovy的Path.traverse()扩展,IntelliJ思想语法错误

rkkpypqq  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(145)

我在编辑Groovy(3.0.10)脚本时遇到了一个我不理解的语法错误:

当我在GroovyConsole中尝试这个方法时,它似乎工作得很好。
为什么IntelliJ IDEA会抱怨呢?这是IntelliJ IDEA 2022.1.1。
文本中的片段:

final java.nio.file.Path p;
p.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
    println dotDeploymentPath
}

更新1

实际上,在我们的产品中运行脚本时,我从Groovy中得到了同样的错误:

Script4.groovy: 59: [Static type checking] - Cannot call java.nio.file.Path#traverse(java.util.Map <java.lang.String, java.lang.Object>, groovy.lang.Closure) with arguments [java.util.LinkedHashMap <java.lang.String, java.io.Serializable>, groovy.lang.Closure]
 @ line 59, column 9.
           extensionsPath.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
           ^

更新2

我最终得到了这个看起来很好的结果。我仍然不明白为什么Groovy不喜欢将选项作为调用的参数。

def final traverseOptions = [type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1] as Map<String, Object>;
extensionsPath.traverse(traverseOptions) { final Path dotDeploymentPath ->
ccrfmcuu

ccrfmcuu1#

所以我就明白了。问题是我在我的类的顶部使用了@CompileStatic。我使用@CompileStatic是因为我误解了它的作用。我认为它类似于Java中的static class。但这不是它的作用。它所做的是这样的,来自docs:* 这将允许Groovy编译器以Java的方式使用编译时检查,然后执行静态编译,从而绕过Groovy meta对象协议。*
(This显示了提供自包含的测试用例是多么的重要。我应该更清楚的。)

相关问题