2014-10-20 50 views
1

屬性例如:檢查兩個對象是相同的,根據它們在Java

public class Fruit{ 
    private String color; 
    private double weight; 
    ... 
    public boolean equals(Fruit a){ 
     return (this.getColor().equals(a.getColor()) && (this.getWeight()==a.getWeight())); 
    } 
} 

public class Orange extends Fruit{ 
    public Orange(double weight) { 
     super("orange", weight); 
    } 
} 

public class NavalOrange extends Orange{ 
    public NavalOrange(double weight) { 
     super(weight); 
    } 
} 

然後我寫了一個關於這個測試來檢查兩個對象,如果它們是相同的。

Orange orange = new Orange(8); 
    NavalOrange navalOrange = new NavalOrange(8); 
    assertEquals(orange, navalOrange); 

但它只是不斷返回錯誤:

junit.framework.AssertionFailedError: expected:<[email protected]> but was:<[email protected]> 

任何人都可以解釋爲什麼這是怎麼回事?我認爲在toString方法中可能會出現問題。

+1

Your equals must take a object as a parameter;如果你需要水果,jUnit不會找到它。如果您使用的是Eclipse,請嘗試右鍵單擊Fruit類並選擇Generate equals()和hashcode()。 – Pokechu22 2014-10-20 01:07:41

回答

2

Object中沒有equals(Fruit)方法。您equals方法應該是這樣開始......

@Override 
public boolean equals(Object a) { 
    boolean equals = false; 
    if (a instanceof Fruit) { 
     ... 
    } 
    return equals; 
} 

基本上,所有assertEquals被使用Object#equals做。您可以通過添加@Override註釋您equals方法還測試這一點,它會產生一個編譯器錯誤,如`等於(水果)不覆蓋任何方法從它的父...

,如果重寫equals,你應覆蓋hashCode,以保持它的合同......

JavaDocs for Object#equals

注意,一般需要重寫每當這個方法被重寫hashCode方法,以維護總承包合同hashCode方法,wh這表明相同的對象必須具有相同的散列碼。

相關問題