在我目前的项目中,我在使用this
和没有this
的字段之间遇到了相当反直觉的区别。显然,如果我在没有this
的情况下访问我的字段,由于某种原因,我会得到一个布尔值而不是我想要访问的字段:
//Weapon extends Simple extends Entity extends Matter extends Object
@groovy.transform.TypeChecked
abstract class Action {
Matter tool
boolean setTool(Matter t) {
if (isValidTool(t)) {
tool = t
return true
} else {
return false
}
}
boolean isValidTool(Matter m) {
return true
}
}
@groovy.transform.TypeChecked
class Attack extends Action {
boolean isValidTool(Matter m) {
return (m instanceof Entity)
}
boolean setTool(Matter t) {
if (isValidTool(t)) {
if (t instanceof Weapon) {
tool = t
} else {
tool = new ImprovisedWeapon((Entity)t)
//ImprovisedWeapon extends Weapon
}
return true
} else {
return false
}
}
@Override
Weapon getTool() {
return (Weapon)this.tool
}
void test() {
Weapon a = this.tool //compile-time error
Weapon b = (Weapon)this.tool //works fine
Weapon c = tool //compile-time error
Weapon d = (Weapon)tool //compile-time error
}
}
我得到的错误,按顺序:
[静态类型检查] - 无法将project.matter.Matter类型的值赋给project.matter.simple.Weapon类型的变量
[静态类型检查] - 不能将类型boolean的值赋给project.matter.simple.Weapon类型的变量
[静态类型检查] - 不可转换类型:无法将boolean转换为project.matter.simple.Weapon
第一个错误是可以解释的,毕竟我不能使用getTool()
,而是有效地使用this.@tool
,这显然会返回一个问题。然而,另外两个错误非常奇怪 - 没有声明局部变量tool
,唯一tool
周围是从Action
继承的,Matter
。getTool()
。本地声明的tool
甚至会返回一个武器,而不是布尔值。所以,我的问题是,当我使用this.tool
时,我在这里访问了什么,为什么它与{{1}}不同?
答案 0 :(得分:1)
注意:这可能更好地作为评论而不是答案,但我没有评论的声誉。
我不知道为什么,但错误似乎与setTool的返回类型有关。我认为拥有不返回任何内容的setter可能更为正常。
我在groovyConsole(groovy 2.2.1)中尝试过这个,并且使用你的代码(以及缺失的虚拟类),我遇到了你看到的最后两个错误(不是第一个) 。一旦我将setTool方法的返回类型设置为void(并删除了返回语句),那些错误就消失了,但第三行(Weapon c = tool
)出现了第一个错误。
不幸的是我无法解释为什么会发生这种情况,但我希望它对你有所帮助!也许其他人可以给出行为背后的推理。