【发布时间】:2019-03-26 16:38:16
【问题描述】:
我有一个 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 不起作用?
因此,如果没有在ChildBean 中实现overridenFunct(),一切正常。
有人可以告诉这里有什么问题吗?
更新:
将方法overridingFunct() 更改为受保护可修复该问题。但是如果我需要重写一个公共方法呢?这是允许的吗?我正在使用 Spring 3.2.8
更新 2:
好吧,我没有明白为什么在抽象父级中重写公共方法会导致 ClassCastException。作为解决方案,我做了以下事情:创建一个具有公共逻辑的所有公共方法的接口,一个实现该接口和所有“公共”方法的抽象类。然后所有子 bean 都从该抽象类扩展,实现其特定逻辑。
【问题讨论】:
-
你能说明
Parent的定义吗? -
@flakes,不幸的是,出于安全原因,我无法在此处发布该类的代码(加上它有 500 多行)。该类实现了可运行并用于向另一个节点发送一些定期请求。它使用了一些其他注入的资源(不确定这是否有用......)。
-
您需要发布更多信息以获得正确答案。如果您无法发布代码,请尝试使用最小可行示例重现您的问题,然后发布。
-
我键入了您的示例代码以尝试重现。但是,我无法重现您的 ClassCastException。更改为被保护可能会解决问题,但这不是正确的答案。还有其他问题。
-
@BrentR,感谢您的尝试。我将处理可以重现问题的代码快照...
标签: java spring inject spring-bean