我希望能得到一个解释,解释为什么对这个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
引擎盖下发生了什么使这成为必要?
更新更多信息:
这是在带有Groovy 2.4.5 JVM 1.8.0_51 的Windows上
整个脚本是一个名为1.groovy的文件中的9行,没有其他内容。
我使用"groovy1.groovy"从控制台(cmdr)运行这个
第8行的错误为:
捕获:java.lang.ClassFormatError:类文件3$f2中的类名"3$f2"非法java.lang.ClassFormatError:类文件3$f2中的类名"3$f2"非法在3.run(3.groovy:8)
这与脚本的名称有关。当您有一个文件"1.groovy"时,groovy会在默认包中生成一个名为"1"的类,这不是一个有效的类名。
当您在不带类型的情况下使用f2(n)
时,由于此方法"太通用",Groovy会尝试找到匹配的方法,或名为f2
的类或名为f2的内部类:加载类1
的内部类f2
失败,因为名称无效。