2010-02-11 101 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