我有以下Groovy代码片段,它试图使用运算符重载来增量,减量和等于。所有这一切都是创建两个实例,执行增量并减少其中一个实例,然后使用重载方法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
答案 0 :(得分:6)
问题是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
答案 1 :(得分:1)
作为一个快速的附加注释,在定义方法的返回类型时,您不需要使用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}"
}
}