【发布时间】:2014-07-25 20:06:37
【问题描述】:
我正在使用 Groovy 类别在 DSL 下工作,我需要覆盖/重载 == 运算符。然而known issue,当类实现Comparable 时,Groovy 将为== 运算符调用compareTo() 方法。我正在寻找一些解决方法(不是 AST 转换),以使 == 完全按照我的意愿行事。
我有以下“玩具”情况:
class Base implements Comparable<Base>{
int a, b
Base(int a, int b) {
this.a = a
this.b = b
}
@Override
int compareTo(Base o) {
return a <=> o.a //compare only a
}
}
class BaseCategory {
static boolean equals(Base base, o) { //complete equals
if (o == null)
throw new NullPointerException()
if (o.getClass() != base.getClass())
return false
return base.a == o.a && base.b == o.b
}
static int compareTo(Base base, o) { //compatible with equals
int c = base.a <=> o.a;
if (c != 0)
return c
return base.b <=> o.b;
}
}
现在当我运行时
use(BaseCategory) {
Base a = new Base(1, 2)
Base b = new Base(1, 3)
println a == b
println a <=> b
}
我得到了true 和0,而不是false 和-1。有什么解决办法吗?
【问题讨论】:
-
您的
equals方法直接调用您的hashCode方法,这不是一个好主意,但可能不是您关心的问题。hashCode方法方法只是返回2 * a所以b是无关紧要的。这真的是你想要的吗? -
这只是为了说明。我已经编辑了示例以使其更有意义。
-
我没有看到 use 块或 mixin,类别是如何应用到这里的?
-
@NathanHughes 我已经更正了示例
-
@MikeSamuel 这些都是小问题,与这个“玩具”示例无关。即使我更仔细地实现
equals()和compareTo(),结果也是一样的。