在 Groovy 2.1.6 脚本中,我定义了一个字段:
import groovy.transform.Field
@Field String test = "abc";
println "Script: ${test}";
def run = new Runnable() {
void run() {
println "Runnable0: ${test}";
new Runnable() {
void run() {
println "Runnable1: ${test}";
}
}.run();
}
}.run();
当从像这里这样的脚本中的匿名类访问它时,Groovy 似乎尝试将此字段转换为引用,并在定义 Runnable 后立即抛出以下异常:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'abc' with class 'java.lang.String' to class 'groovy.lang.Reference'
at bug1.run(bug1:5)
此外,如果我将匿名 Runnables 放在像这里这样的函数中,Groovy 的转换没有问题,但在内部 Runnable 中找不到字段:
groovy.lang.MissingFieldException: No such field: test for class: bug2$1
at bug2$1.this$dist$get$1(bug2.groovy)
at bug2$1$2.propertyMissing(bug2.groovy)
at bug2$1$2.run(bug2.groovy:14)
at java_lang_Runnable$run.call(Unknown Source)
at bug2$1.run(bug2.groovy:12)
at java_lang_Runnable$run.call(Unknown Source)
at bug2.fun(bug2.groovy:9)
at bug2.run(bug2.groovy:5)
这可以通过像这里一样重新定义字段来 修复,但是这个修复只适用于函数内部
这是 Groovy 中的错误还是我只是违反了一些规则而 Groovy 只是缺少适当的异常?