问题
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 {
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.
回答1:
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.
回答2:
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.
回答3:
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...
来源:https://stackoverflow.com/questions/2244086/using-equals-inside-a-generic-class