我希望我的EqualTester
泛型类调用其泛型参数的重写equals(...)
方法,但它似乎会调用Object.equals
。这是我的测试代码:
import junit.framework.TestCase;
public class EqualityInsideGenerics extends TestCase {
public static class EqualTester<V> {
public boolean check(V v1, V v2) {
return v1.equals(v2);
}
}
public static class K {
private int i;
private Object o;
public K(Object o, int i) {
this.o = o;
this.i = i;
}
public boolean equals(K k) {
return ((k.o != null && k.o.equals(o)) || o == null) && (k.i == i);
}
};
public void testEqual() {
K k1 = new K(null, 0);
K k2 = new K(null, 0);
assertTrue(k1.equals(k2)); // This one ok
EqualTester<K> tester = new EqualTester<K>();
assertTrue(tester.check(k1, k2)); // This one KO!
}
}
您能否解释一下为什么这不起作用,以及如何更改我的EqualTester
课程?
是因为K
实际上没有覆盖Object.equals()方法(因为参数的类型不正确)?
感谢。
答案 0 :(得分:7)
您需要将代码编码为public boolean equals(Object k)
,然后转换为k
。
现在你只是重载了equals方法。
向方法添加@Override
注释也很有用。
覆盖方法签名时必须完全匹配。
答案 1 :(得分:4)
因为equals(K k)
实际上没有覆盖equals(Object o)
方法。
您必须完全覆盖equals(Object o)
才能使其正常工作。
答案 2 :(得分:2)
感谢Padmarag和Phill!
有效的解决方案:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof K)) {
return false;
}
K k = (K)obj;
return ((k.o != null && k.o.equals(o)) || o == null) && (k.i == i);
}
欢迎评论:几天前我开始用Java编程......