在 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 并显示消息“没有此类属性:类的值: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 认为值字段是子类的属性。我正在使用 Groovy 版本“Groovy 版本:1.6.3 JVM:1.5.0_18”。
这是当前版本的 groovy 中的一个已知错误,目标是在 groovy 2.0 中修复。看GROOVY-3073 https://issues.apache.org/jira/browse/GROOVY-3073.
发生这种情况是因为元类中存在范围界定错误,第一个示例中的闭包无法看到私有类级别变量。
解决这种情况问题的一个潜在解决方案是在超类中声明一个本地别名变量,这可以解决闭包中的范围问题。将构造函数更改为:
ParentClass(columnCount) {
def valueAlias = values
columnCount.times { valueAlias.add('') }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)