覆盖抽象超类的equal和hashCode

时间:2010-10-13 12:02:14

标签: java abstract-class equals hashcode

考虑下面给出的示例代码:

抽象名称

public abstract class Name {
    private String name;
 public Name(String name)
 {
  this.name=name;
 }
 public String toString()
 {
  return name;

 }
 public String getName() {
  return name;
 }
}

public class FirstName extends Name {

 FirstName(String name) {
  super(name);
 }
 public String toString()
 {
  return getName();
 }
}

名字

public class LastName extends Name{
LastName(String name) {
super(name);
}
public String toString()
{
 return getName();
}
}

测试名

public class TestName {
public static void main(String[] args) {
 Set<Name> names=new HashSet<Name>();
 names.add(new FirstName("George"));
 names.add(new LastName("Bush"));
 names.add(new FirstName("Bush"));
    System.out.println(names);
}
}

输出

  [布什,布什,乔治]

现在的问题是如何覆盖hashcode和equal的方法,这样我只有一个名字“Bush”作为名字或姓氏?

2 个答案:

答案 0 :(得分:4)

你可能想要这样的东西:

 public boolean equals(Object obj)
 {
   if (obj == null)
     return false;
   if (!(obj instanceof Name))
     return false;
   Name name = (Name) obj;
   return this.name.equals(name.name);
 }

 public int hashCode()
 {
   return name.hashCode();
 }

答案 1 :(得分:2)

您应该提供自定义的equals方法,而不是默认方法。通过契约,FirstName和LastName永远不会相等,因为它们是2个不同的类(在这种情况下具有相同的内容)。

编辑:从eclipse生成的equals方法:

public boolean equals( Object obj )
{
    if ( this == obj )
        return true;
    if ( obj == null )
        return false;
    if ( getClass() != obj.getClass() )
        return false;
    Name other = (Name) obj;
    if ( name == null )
    {
        if ( other.name != null )
            return false;
    }
    else if ( !name.equals( other.name ) )
        return false;
    return true;
}