Я не вижу проблемы с кастингом. Тип аргумента, равный равному, - Object, поэтому вам все равно необходимо привести в действие, чтобы получить доступ к атрибутам.
Если вы определяете метод equals в каждом подклассе, когда возникает ситуация, когда equals в абстрактном суперклассе вызывается?
Если я сделаю равное, я рискну сравнить с различными дочерними организациями и
получить, что они похожи
В любом случае, вы рискуете сравнить разные субстанции друг с другом. Представьте, что Set с суперклассом является типом, заполненным объектами, которые являются двумя экземплярами двух разных подклассов. Это не слишком связано с тем, переопределяете ли вы «равно» в суперклассе или нет.
В вашем примере метод equals, возможно реализованный в абстрактном классе, Log не будет вызываться, если у нас уже есть реализация в фактическом подклассе:
Предполагая, что:
UserLog extends Log{
public boolean equals(Object o) {
//I do override equals method so I am one who is called.
//and here you go and check type with something like
if (this == o) return true;
if (!(o instanceof UserLog)) return false;//accepts subclasses of UserLog
....
}
...
}
//And then somewhere else
Log ul = new UserLog();
test(ul);