То, как я переопределяю, равняется методу в классе объекта?
т.е. я имею
class Person{
//need to override here
public boolean equals (Object obj){
}
Я хочу преобразовать параметр obj в Человека типа, но если я сделаю (Человек) obj, то он не будет работать.
Вы можете преобразовать его внутри метода, просто убедитесь, что он имеет правильный тип, используя экземпляр
if(obj instanceof Person)
{
Person otherPerson = (Person) obj;
//Rest of the code to check equality
}
else
{
//return false maybe
}
На самом деле это сложнее, чем вы думаете. Попросите Eclipse (или любую другую IDE, которую вы используете) автоматически сгенерировать метод equals
; вы увидите, что он содержит несколько проверок и приведений, прежде чем выполнить сравнение.
Также см. здесь: http://www.javapractices.com/topic/TopicAction.do?Id=17
@Override
public boolean equals(Object o)
{
if (o instanceof Person)
{
Person c = (Person) o;
if ( this.FIELD.equals(c.FIELD) ) //whatever here
return true;
}
return false;
}
Взгляните на Относительно сравнения объектов .
Имейте в виду, что если вы переопределите equals ()
, вы должны также переопределить hashCode ()
. Контракт equals / hashCode заключается в том, что если два объекта равны, они должны иметь одинаковый хэш-код.
Если вы планируете создать подклассы Person, используйте что-то вроде
if (obj! = Null && obj.getClass () == Person.class )
, а не instanceof
Еще один момент, который может быть полезным, если вы переопределите метод equals ()
(а также метод hashcode ()
), вы можете для сравнения двух объектов одного класса, как показано ниже:
Person p1 = new Person();
Person p2 = new Person();
....
if ( p1.equals( p2 ) )
{
// --- Two Persons are equal, w.r.t the fields you specified in equals method ---
}
Единственная причина использовать getClass()
, а не instanceof
- это если нужно утверждать, что обе сравниваемые ссылки указывают на объекты одного и того же класса, а не на объекты, реализующие один и тот же базовый класс.
Скажем, у нас есть Employee
e и Manager
m (расширяет Employee
).
m instanceof Employee
выдаст true, m.getClass() == Employee.class
вернет false.
В некоторых случаях последнее может быть предпочтительнее, но редко, в случае сравнения экземпляров в методах equals()
или hashCode()
.