Groovy - 使用def参数调用方法失败,显示“非法类名”错误。

10

我希望能够得到一个关于为什么调用这个Groovy方法按预期工作的解释:

def f1(int n) {
  return n + 1
}
println f1(1) // -> 2

但是,如果参数没有被明确定义(使用“def n”而不是“int n”),则需要更改方法调用:

def f2(def n) {
  return n + 1
}
println f2(1) // Exception: Illegal class name
println this.&f2(1) // -> 2
这是什么原因导致这种情况发生?新增更多信息:这是在Windows上,使用Groovy 2.4.5和JVM 1.8.0_51。整个脚本就是一个名为1.groovy的文件中的9行代码,没有其他内容。我正在控制台(cmdr)中使用“groovy 1.groovy”运行此脚本。第8行的错误是:“Caught: java.lang.ClassFormatError: Illegal class name "3$f2" in class file 3$f2 java.lang.ClassFormatError: Illegal class name "3$f2" in class file 3$f2 at 3.run(3.groovy:8)”

def f3(n) {... 是什么意思?此外,这是 Groovy 的哪个版本? - doelleri
"f2(1)" 对我来说运行良好。请注意,在方法参数中添加 def 完全是不必要的。 - Nathan Hughes
我对你的示例没有任何问题,在Groovy Web控制台或Java应用程序中进行了测试。这可能与您未在此处显示的上下文有关。 - Jérémie B
这是在Windows上使用Groovy 2.4.5 JVM 1.8.0_51的代码,整个脚本仅有9行。第8行的错误是:Caught: java.lang.ClassFormatError: Illegal class name "3$f2" in class file 3$f2。java.lang.ClassFormatError: Illegal class name "3$f2" in class file 3$f2,在3.groovy文件的第8行出现了问题。 - Jahg Daglet
doelleri - 从参数中删除def - def f2(n) {} - 抛出异常,因为它是无效的。 - Jahg Daglet
Jeremie - 是的,我刚在 groovysh 中尝试了一下,它可以工作 - 那么在脚本中运行并调用“groovy scriptname”有什么不同呢? - Jahg Daglet
1个回答

22

这与您脚本的名称有关。当您有一个名为"1.groovy"的文件时,Groovy会生成一个名为"1"的类,位于默认包中,但这不是有效的类名。

当您使用f2(n)而没有类型时,由于该方法“太通用”,Groovy尝试查找匹配的方法,或名为f2的类,或名为f2的内部类: 加载类1的内部类f2失败,因为该名称无效。


太好了 - 就是这样!文件实际上叫做3.groovy,现在我明白错误信息了。 - Jahg Daglet
提示:解决这个问题的另一种方法是将您的方法包装在一个具有有效名称的类中。 - cmcginty
1
我刚遇到了这个问题,因为我的文件名中有一个“-”。将其替换为“_”就解决了。你挽救了我今天下午的生产力。谢谢! - gturri
我的酷炫脚本的名字里有一个连字符。去掉它解决了问题。谢谢 @gturri - kkid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接