在Groovy中,我有一个父类和一个子类,其中父类的构造函数尝试使用闭包设置父类的字段值,如下面的代码所示:
try {
def x = new ChildClass()
} catch (ex) {
ex.printStackTrace(System.err)
}
class ParentClass {
private values = []
ParentClass(columnCount) {
columnCount.times { values.add('') }
}
}
class ChildClass extends ParentClass {
ChildClass() {
super(20)
}
}
但是,当我运行此代码时,我得到一个groovy.lang.MissingPropertyException,并显示消息“No such property:values for class:ChildClass”。但是,如果我将父类的构造函数更改为不使用带有times方法的闭包,如下例所示:
try {
def x = new ChildClass()
} catch (ex) {
ex.printStackTrace(System.err)
}
class ParentClass {
private values = []
ParentClass(columnCount) {
def i
for (i = 0; i < columnCount; i++) {
values.add('')
}
}
}
class ChildClass extends ParentClass {
ChildClass() {
super(20)
}
}
有效。有人可以向我解释这种行为吗?我不明白为什么Groovy认为values字段是子类的属性。我使用的是Groovy版本“Groovy Version:1.6.3 JVM:1.5.0_18”。
答案 0 :(得分:5)
这是当前版本的groovy中的已知错误,目标是在groovy 2.0中修复。请参阅GROOVY-3073。
这是因为元类中的一个范围错误,第一个示例中的闭包无法看到私有类级变量。
针对这种情况解决问题的一个潜在解决方案是在超类中声明一个本地别名变量,这解决了闭包中的作用域问题。将构造函数更改为:
ParentClass(columnCount) {
def valueAlias = values
columnCount.times { valueAlias.add('') }
}