Groovy:使用“this”访问字段和没有它的区别有什么区别?

时间:2014-02-08 09:19:48

标签: groovy this

在我目前的项目中,我在使用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继承的,MattergetTool()。本地声明的tool甚至会返回一个武器,而不是布尔值。所以,我的问题是,当我使用this.tool时,我在这里访问了什么,为什么它与{{1}}不同?

1 个答案:

答案 0 :(得分:1)

注意:这可能更好地作为评论而不是答案,但我没有评论的声誉。

我不知道为什么,但错误似乎与setTool的返回类型有关。我认为拥有不返回任何内容的setter可能更为正常。

我在groovyConsole(groovy 2.2.1)中尝试过这个,并且使用你的代码(以及缺失的虚拟类),我遇到了你看到的最后两个错误(不是第一个) 。一旦我将setTool方法的返回类型设置为void(并删除了返回语句),那些错误就消失了,但第三行(Weapon c = tool)出现了第一个错误。

不幸的是我无法解释为什么会发生这种情况,但我希望它对你有所帮助!也许其他人可以给出行为背后的推理。