У меня есть bean-компонент Spring (ChildBean extends Parent
), который расширяет абстрактный класс (Parent implements Runnable
).
public abstract class Parent implements Runnable {
public final void run() {
// some code
}
public int overridenFunct() {
// some code
}
}
Вариант класса дочернего компонента, который вызывает ClassCastException:
@Transactional
@Scope("prototype")
@Service("beanName")
public class ChildBean extends Parent {
@Override
public int overridenFunct() {
// some diff code
}
}
Все работает нормально, пока я не переопределю публичный неабстрактный метод из родительского класса в дочернем бине.После этого создается ClassCastException, когда я пытаюсь создать экземпляр этого компонента.
Parent p = (Parent) appContext.getBean("beanName");
Объект компонента, возвращаемый getBean()
, является экземпляром класса ChildBean
(проверено с помощью отладчика).Почему приведение ChildBean
объекта к его абстрактному родительскому классу Parent
не работает?Таким образом, без overridenFunct()
, реализованного в ChildBean
, все работает отлично.Может кто-нибудь сказать, в чем здесь проблема?
ОБНОВЛЕНИЕ:
Изменение метода overridingFunct()
на защищенное устраняет проблему.Но что, если мне нужно переопределить публичный метод?Это разрешено?Я использую Spring 3.2.8
UPDATE2:
Ну, я не дошел до того, почему переопределение публичного метода в абстрактном родительском объекте вызывает ClassCastException.В качестве решения я сделал следующее: создал интерфейс со всеми открытыми методами с общей логикой, абстрактный класс, который реализует этот интерфейс и все «общие» методы.Затем все дочерние компоненты расширяются из этого абстрактного класса, реализуя его специфическую логику.