覆盖java中的hashcode和equals方法?

我有以下课程:

public class Sample implements java.io.Serializable{ //POJO with two fields and getters/setters private String name; private Integer id; //This POJO does not override equals() and hashCode() } public class B{ private Sample sample; //here i need override hashcode and equals() based on **sample** property. } 

当我尝试在B类中重写equals()和hashCode()时,我在Eclipse中得到了以下错误。

字段类型com.mypackage.Sample未实现hashCode()和equals() – 生成的代码可能无法正常工作。

现在,我如何基于Sample属性比较两个B实例是否等于? 我无法修改Sample类。

你看起来像下面的东西? 试试吧,从您的问题来看,我认为您也希望比较Sample类的内容。

 class Sample implements java.io.Serializable{ //POJO with two fields and getters/setters private String name; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } //This POJO does not override equals() and hashCode() } public class Beta implements Comparable{ private Sample sample; public Sample getSample() { return sample; } public void setSample(Sample sample) { this.sample = sample; } @Override public int compareTo(Object o) { if(!(o instanceof Beta)){ return -1; } }if(((Beta)o).getSample().getName().equals(this.sample.getName())){ return 0; // return true if names are equal } if(((Beta)o).getSample().getId().equals(this.sample.getId())){ //if name are notequal and IDs are equal, do what you need to do } return -1; } public static void main(String[] args) { Beta b = new Beta(); Sample s = new Sample(); s.setId(10); s.setName("Name1"); b.setSample(s); Beta b2 = new Beta(); Sample s2 = new Sample(); s2.setId(20); s2.setName("Name2"); b2.setSample(s2); System.out.println(b2.compareTo(b)); Beta b3 = new Beta(); Sample s3 = new Sample(); s3.setId(10); s3.setName("Name1"); b3.setSample(s3); System.out.println(b3.compareTo(b)); } } 

压倒一切的方法

 class Sample implements java.io.Serializable{ //POJO with two fields and getters/setters private String name; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } //This POJO does not override equals() and hashCode() } public class Beta /*implements Comparable*/{ private Sample sample; public Sample getSample() { return sample; } public void setSample(Sample sample) { this.sample = sample; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Beta other = (Beta) obj; if ((this.getSample() == null) && (other.getSample() == null)){ return true; } if ((this.getSample().getId().equals(other.getSample().getId())) && (this.getSample().getName().equals(other.getSample().getName()))) { return true; } return false; } @Override public int hashCode() { int hash = 3; hash = 53 * hash + (this.getSample().getName() != null ? this.getSample().getName().hashCode() : 0); hash = 53 * hash + (this.getSample().getId() != null ? this.getSample().getId().hashCode() : 0); return hash; } /* @Override public int compareTo(Object o) { if(!(o instanceof Beta)){ return -1; } if(((Beta)o).getSample().getId().equals(this.sample.getId()) && ((Beta)o).getSample().getName().equals(this.sample.getName())){ return 0; } return -1; }*/ public static void main(String[] args) { Beta b = new Beta(); Sample s = new Sample(); s.setId(10); s.setName("Name1"); b.setSample(s); Beta b2 = new Beta(); Sample s2 = new Sample(); s2.setId(20); s2.setName("Name2"); b2.setSample(s2); System.out.println(b2.equals(b)); Beta b3 = new Beta(); Sample s3 = new Sample(); s3.setId(10); s3.setName("Name1"); b3.setSample(s3); System.out.println(b3.equals(b)); } 

如果你没有显式覆盖.equals() ,它们将仅基于它们的引用进行比较(尽管没有equals() ,每个对象都从Objectinheritance)。 如果您只想基于Sample比较B ,那么只需执行以下操作:

 @Override public boolean equals(Object o) { if (o istanceof B) { return sample.equals(o.sample) } return false; } 

此外,您应该覆盖hashCode() (和compareTo() )以维护equals()hashCode()之间的契约 。 因此,您还应该具备以下条件:

 @Override public int hashCode() { return sample.hashCode(); } 

编辑(回应评论):

我的要求是首先我需要检查Sample的“name”属性的equals属性。 如果IF名称相等则两个对象都相等。 如果名称不等于那么我需要检查Sample与“ID”属性的相等性。 我怎样才能做到这一点? 谢谢!

确定Samples是否等效应通过覆盖equals()Sample处理。 如果Sample基于nameid equals() ,那么你没事。 如果你想比较B Samples而不是通常比较它们,那么如果你使用Sample hashCode()equals() ,那么你将无法维持B equals()hashCode()之间的契约。 ,这意味着你的hashCode()equals()应该不能从Sample调用equals()hashCode() 。 有关如何根据特定字段覆盖,请参阅本教程 。