我有一个Spring bean(ChildBean extends Parent
),它正在扩展抽象类(Parent implements Runnable
)。
public abstract class Parent implements Runnable {
public final void run() {
// some code
}
public int overridenFunct() {
// some code
}
}
导致ClassCastException的子bean类变体:
@Transactional
@Scope("prototype")
@Service("beanName")
public class ChildBean extends Parent {
@Override
public int overridenFunct() {
// some diff code
}
}
一切正常,直到我从子bean的父类重写公共非抽象方法为止。之后,当我尝试创建该bean的实例时,抛出ClassCastException。
Parent p = (Parent) appContext.getBean("beanName");
由getBean()
返回的 Bean对象是一个ChildBean
类实例(已通过调试器检查)。为什么将ChildBean
对象转换为其抽象父类Parent
无效?
因此,如果没有在overridenFunct()
中实现ChildBean
,一切正常。
有人可以告诉我这是什么问题吗?
更新:
更改受保护的方法overridingFunct()
可解决此问题。但是,如果我需要重写公共方法怎么办?可以吗我正在使用Spring 3.2.8
UPDATE2:
好吧,我没有弄清楚为什么抽象父级中重写公共方法会导致ClassCastException。作为解决方案,我做了以下工作:创建一个具有所有具有公共逻辑的公共方法的接口,一个抽象类,该类实现该接口和所有“公共”方法。然后,从该抽象类扩展所有子bean,实现其特定的逻辑。
答案 0 :(得分:0)
您的代码存在的问题是appContext.getBean("beanName")
没有返回从类Parent
继承的对象。
关于名称类似于Parent
的类的常见错误是错误的导入。
检查是否从正确的软件包中导入。
如果这不能解决问题,请确保appContext.getBean("beanName")
返回您认为确实可行的对象。
它可能会返回一个不继承自Parent
类的Bean对象。
上下文甚至可能还不包含您的ChildBean对象。确保已将其预先添加。