Я ищу руководство относительно переопределения как hashcode, так и equals в подклассе.Различать подклассы через equals & hashcode
Я нашел аналогичный вопрос здесь: Overriding equals() & hashCode() in sub classes ... considering super fields
Но то, что я хочу что-то немного отличается.
Представьте себе это (несколько глупостей) пример:
class Food {
String name;
@Override
public boolean equals(Object obj) {
if (obj instanceof Food) {
Food other = (Food)obj;
return name.equals(other.name);
}
return false;
}
@Override
public int hashCode() {
return name.hashCode();
}
}
class Vegetable extends Food {
// No additional fields here
// Some methods here
}
class Fruit extends Food {
// No additional fields here
// Some methods here
}
Учитывая, что:
- Подклассы не добавляют дополнительные поля
- в этом примере, по крайней мере, они в основном только классы маркеров
Fruit
иVegetable
с тем же именем, не должны быть равны
Вопросы:
- Вы бы ожидать, что подкласс равно просто содержать
instanceof
проверку подкласса и вызоваsuper.equals
? - Как следует структурировать хэш-код в попытке иметь
Fruit
иVegetable
экземпляры с тем же именем имеют разные хэш-коды?
Ха-ха, привет, привет! –
вы можете использовать имя класса в качестве компонента хэш-кода (например: '17 * classname.hashcode() + super.hashcode()') –
Обратите внимание, что многие структуры данных в Java API показывают поведение, которое вы показаны здесь. Взгляните на все виды Карт. Например, HashMap может равняться LinkedHashMap. Карты действительно проверяют содержимое Карты. Класс реализации не имеет большого значения. –