Переопределить равные и hashCode для абстрактного суперкласса - PullRequest
3 голосов
/ 13 октября 2010

Рассмотрим пример кода, приведенный ниже:

Абстрактное имя

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();
}
}

TestName

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);
}
}

Выход

[Буш,Буш, Джордж]

Теперь вопрос в том, как переопределить хэш-код и метод равных таким образом, чтобы у меня было только одно имя "Буш" в качестве имени или фамилии?

Ответы [ 2 ]

4 голосов
/ 13 октября 2010

Вы, вероятно, хотите что-то вроде этого:

 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();
 }
2 голосов
/ 13 октября 2010

вы должны предоставить собственный метод equals, а не метод по умолчанию. по контракту FirstName и LastName никогда не могут быть равны, потому что это 2 разных класса (в данном случае с одинаковым содержимым).

edit: сгенерированный метод 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;
}
...