То, что вы проверяете, не обязательно является «проблемой»: equals()
объявляется в классе Object
и принимает в качестве параметра Object
.Классы переопределяют этот метод, и их реализация вполне может позволить объекту другого класса "равняться" целевому объекту.
Я сам делал это несколько раз, например, для разрешенияобъект, "равный" другому объекту, если другой объект (скажем, строка) соответствует ключевому полю цели:
class MyClass {
private String id;
public boolean equals(Object obj) {
// Compare as if "this" is the id field
return id.equals(obj instanceof MyClass ? ((MyClass)obj).id : obj);
}
public int hashCode() {
return id.hashCode(); // so hashCode() agrees with equals()
}
}
Это на самом деле довольно удобно, потому что следующий код будетработа по желанию:
List<MyClass> list = new ArrayList<MyClass>();
// collection methods will work with instances:
list.contains(someInstance);
list.remove(someInstance);
list.indexOf(someInstance);
// and with keys!
// handy if you can only get the key, for example from a web url parameter
list.contains("somekey");
list.remove("somekey");
list.indexOf("somekey");