Groovy - 使用def参数调用方法失败,出现'Illegal class name'

时间:2016-04-06 19:55:20

标签: groovy

我希望得到一个解释,为什么对这个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行 - 没有别的。

我使用“groovy 1.groovy”

从控制台(cmdr)运行它

第8行的错误是:

Caught:java.lang.ClassFormatError:类文件3 $ f2中的非法类名“3 $ f2” java.lang.ClassFormatError:类文件3 $ f2中的非法类名“3 $ f2”         在3.run(3.groovy:8)

1 个答案:

答案 0 :(得分:18)

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

当你使用没有类型的f2(n)时,因为这个方法过于通用",Groovy尝试找到一个匹配的方法,或一个名为f2的类,或一个内部名为f2的类:加载类f2的内部类1失败,因为名称无效。