2014-10-20 92 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这表明相同的对象必须具有相同的散列码。

相关问题