I'd like my EqualTester
generic class to call the overridden equals(...)
method of its generic parameter, but it seems to call Object.equals
instead. Here is my test code:
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 {
开发者_JAVA技巧 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!
}
}
Could you please explain why this does not work, and how I could change my EqualTester
class?
Is it because K
does not actually override the Object.equals() method (because the parameter does not have the correct type)?
Thanks.
You need to code as public boolean equals(Object k)
, and then cast to k
.
Right now you are just overloading the equals method.
It's also useful to add @Override
annotation to the method.
When overriding the method signature must match exactly.
Because equals(K k)
does not actually override the equals(Object o)
method.
You must override equals(Object o)
exactly in order for it to work.
Thanks Padmarag and Phill!
A solution that works:
@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);
}
Comments welcome: I started programming in Java only a few days ago...
精彩评论