我希望得到一个解释,为什么对这个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)
答案 0 :(得分:18)
这与您的脚本名称有关。当你有一个文件" 1.groovy"时,Groovy会生成一个名为" 1"的类。在默认包中,它不是有效的类名。
当你使用没有类型的f2(n)
时,因为这个方法过于通用",Groovy尝试找到一个匹配的方法,或一个名为f2
的类,或一个内部名为f2的类:加载类f2
的内部类1
失败,因为名称无效。