2013-04-11 149 views
2

這是我的問題: 當我嘗試重寫「我的類」的equals方法時,它根本不起作用,調用的函數是最抽象的一個,而不是「我的類」等於方法!下面是我的程序的一些代碼: 這是「我的課」等於代碼:覆蓋等於不工作

@Override 
public boolean equals(Object o){ 
    StudentProxy s = (StudentProxy)o; 
    return Matricola == s.Matricola && Name == s.Name && Surname == s.Surname; 
} 

這裏是我的斷言失敗:

@Test 
public void storeStudentTest() throws Exception{ 
    StudenteProxy s = new StudenteProxy(100, "Gianni", "Rosso", 27.2, 132); 
    DB.storeStudent(s); 
    StudentProxy ret = (StudentProxy)DB.retrieveStudentData(s.getMatricola()); 
    DB.deleteStudent(s); 
    assertEquals(ret, s); // HERE ! ! ! 
} 

我也試過用assertTrue:

assertTrue(ret.equals(s)); 

但我得到AssertionError;我認爲這是由於最抽象的equals被調用所導致的,並且由於兩個對象不是同一個對象,所以它給了我AssertionError消息。

任何想法? :(

PS:他們應該是平等的,我用不同的方式檢查了很多次所以這不是問題,我已經測試此代碼很多次,發現問題是等於不覆蓋;)

+4

你看過正在返回的對象的內容嗎?此外,這些字段似乎是對象,您應該將它們與'equals()'而不是'=='進行比較。 – 2013-04-11 19:09:26

+0

你確定你的代碼是在等於加法後重新編譯的嗎? – danieln 2013-04-11 19:10:30

+0

我假設名稱和姓氏是字符串,所以你需要使用.equals而不是==作爲@AndrewLogvinov的建議。除此之外,你是否在Matricola上實現了平等? – 2013-04-11 19:10:45

回答

7

這很難說沒有更多的信息,但現在看來,你的MatricolaNameSurname字段Object S,可能String秒。在這種情況下,您應該像這樣比較它們:

return Matricola.equals(s.Matricola) && Name.equals(s.Name) && Surname.equals(s.Surname); 

否則,您是比較引用。

+0

我深深地愛着你;)我很喜歡Java – Francesco 2013-04-11 19:17:25

+1

很有趣,你想重寫一個'equals()'方法,然後使用'=='。 – 2013-04-11 19:19:44

+0

它比有趣@SotiriosDelimanolis更愚蠢,我完全知道它! :P – Francesco 2013-04-11 19:23:25

0

比較字符串,你應該使用等於