Java 在泛型类中使用equals

Java 在泛型类中使用equals,java,generics,equals,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)

我希望我的
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!
    }
}
导入junit.framework.TestCase;
公共类EqualityInsideGenerics扩展了测试用例{
公共静态类EqualTester{
公共布尔检查(vv1,vv2){
返回v1.equals(v2);
}
}
公共静态类K{
私人互联网i;
私人客体o;
公共K(对象o,int i){
这个。o=o;
这个。i=i;
}
公共布尔等于(K){
返回((k.o!=null和&k.o.equals(o))| | o==null)和&(k.i==i);
}
};
公营机构{
kk1=新的K(null,0);
kk2=新的K(空,0);
assertTrue(k1.equals(k2));//这个可以
EqualTester测试仪=新EqualTester();
assertTrue(tester.check(k1,k2));//这个KO!
}
}
您能解释一下为什么这不起作用,以及我如何更改我的
EqualTester
课程吗

是因为
K
实际上没有重写Object.equals()方法(因为参数的类型不正确)


谢谢。

您需要编码为
公共布尔等于(对象k)
,然后强制转换为
k

现在您只是重载了equals方法

向方法添加
@Override
注释也很有用

重写方法时,签名必须完全匹配。

因为
equals(kk)
实际上并不重写
equals(Object o)
方法


您必须完全重写
等于(对象o)
,才能使其工作。

谢谢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编程…

很高兴能为您提供帮助。如果你想要一些更高级(和棘手)的信息,请尝试此链接-在强制转换之前也使用instanceof,那么你就不需要ClassCastException try块。这是一个好的静态分析工具可以帮助你的领域。我完全推荐使用Findbugs,它会检测到这个错误,并给出了关于为什么它是一个错误的详细信息。