在泛型类中使用equals

时间:2010-02-11 11:29:31

标签: java generics equals

我希望我的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()方法(因为参数的类型不正确)?

感谢。

3 个答案:

答案 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编程......