开发者

Using equals inside a generic class

开发者 https://www.devze.com 2022-12-19 17:34 出处:网络
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:

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...

0

精彩评论

暂无评论...
验证码 换一张
取 消