【问题标题】:Groovy Operator Overloading Increment/Decrement ErrorGroovy 运算符重载增量/减量错误
【发布时间】:2012-05-15 21:50:09
【问题描述】:

我有以下 Groovy 代码 sn-p,它试图将运算符重载用于递增、递减和等于。所有这一切都是创建两个实例,执行其中一个实例的递增和递减,然后使用重载方法 equals 比较这两个实例。当我进行比较时,它失败了。当此代码完成时,两者都应为 100。 (打印语句显示它,但toString() 函数之一似乎是错误的)。我在这里做错了什么?

这是 groovy 1.8.6

class Overload {
    def value

    public Overload(value = 0) {
        this.value = value
    }

    def next() {
        value = value + 1;
    }

    def previous() {
        value = value - 1;
    }

    def boolean equals(other) {
        if (value == other?.value) {
            return true
        }

        return false
    }

    def String toString() {
        "value is = ${value}"
    }
}

def cls1 = new Overload(100)
def cls2 = new Overload(100)

cls1++
cls1--
if (cls1 == cls2) {
    println("cls1 == cls2")
}
else {
    println("cls1 != cls2")
}

println(cls1.toString())
println(cls2.toString())

输出:

cls1 != cls2
100
value is = 100

【问题讨论】:

    标签: groovy operator-overloading overloading


    【解决方案1】:

    问题是Overload实例的递增和递减方法。

    Groovy 具有隐式返回最后一个表达式的特性。当您调用cls1++ 时,现在对象是一个整数,这就是我们看不到被覆盖的toString 方法的输出的原因。

    def next() {
        value = value + 1
        return this
    }
    
    def previous() {
        value = value - 1
        return this
    }
    

    立即查看:

    assert cls1.class == Overload
    assert cls2.class == Overload
    assert cls1 == cls2
    assert cls1 == 100
    assert cls2 == 100
    

    【讨论】:

    • 天哪,这很奇怪。所以 groovy 正在自动装箱返回并将整个类转换为一元操作。哎哟。我没有意识到在这种情况下它有回报并且它会这样做。谢谢,这真的很有帮助。我必须更加小心。
    【解决方案2】:

    作为一个快速的附加注释,在定义方法的返回类型时,您不需要使用def。您的课程更简洁的版本是:

    class Overload {
        def value
    
        public Overload(value = 0) {
            this.value = value
        }
    
        def next() {
            value = value + 1
            this
        }
    
        def previous() {
            value = value - 1
            this
        }
    
        boolean equals(other) {
            value == other?.value
        }
    
        String toString() {
            "value is = ${value}"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多