2010-02-11 100 views
3

我希望我的EqualTester泛型类调用其泛型参数的覆盖equals(...)方法,但它似乎改为调用Object.equals。这里是我的测试代码:在泛型类中使用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()方法(因为参数没有正确的类型)?

谢谢。

回答

7

您需要编码为public boolean equals(Object k),然后转换为k

现在你只是重载等于方法

@Override注释添加到该方法也很有用。

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

4

因为equals(K k)实际上并未覆盖equals(Object o)方法。

必须覆盖equals(Object o)正是为了它的工作。

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编程开始仅在几天前...

+0

很高兴我能有所帮助。 如果你想要一些更高级的(和棘手的)信息,请尝试这个链接 - http://www.artima.com/lejava/articles/equality.html – Padmarag 2010-02-11 12:04:37

+0

在投射之前也使用instanceof,那么你将不需要ClassCastException尝试块。 – Padmarag 2010-02-11 12:06:01

+0

完成!谢谢... – 2010-02-11 12:44:20