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,它会检测到这个错误,并给出了关于为什么它是一个错误的详细信息。