Проблема в том, что метод объявлен final в суперклассе. Это означает, буквально, «этот метод не может быть переопределен». Если вам нужно поместить свою собственную логику в doFilter()
, вы не можете расширить CachingFilter.
В Java нет понятия , где вы переопределяете метод. Интерфейс - это контракт, который сообщает другим, что может сделать ваш класс. Полный контракт - это сумма всех реализованных интерфейсов. Неважно, присутствует ли идентичная сигнатура метода в нескольких интерфейсах. Класс выполнения контракта.
Наследование начинается сверху (т. Е. Object), и каждый переопределенный метод заменяет любые ранее существующие определения любого родителя в качестве общедоступного метода - , за исключением , если метод объявлен final
. Это говорит компилятору, что реализация этого метода не может быть переопределена, это окончательная его версия.
РЕДАКТИРОВАТЬ: Я не знаю, из чего исходит CachingFilter
, который вы используете, но общий шаблон в средах, наложенных поверх других платформ или стандартного API Java, заключается в создании окончательной реализации метода, требуемого API (doFilter()
в этом случае), но добавьте еще один "внутренний" метод (например, internalDoFilter()
), который вызывается из doFilter()
. Расширяющиеся классы могут затем безопасно переопределить «внутренний» метод, при этом гарантируя, что любая существенная логика в doFilter()
по-прежнему выполняется правильно.