- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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 中覆盖父类的公共(public)非抽象方法。之后,当我尝试创建该 bean 的实例时抛出 ClassCastException。
Parent p = (Parent) appContext.getBean("beanName");
getBean()
返回的 Bean 对象是一个 ChildBean
类实例(已通过调试器检查)。为什么将 ChildBean
对象转换为其抽象父类 Parent
不起作用?因此,如果没有在 ChildBean
中实现的 overridenFunct()
一切正常。有人能告诉我这里有什么问题吗?
更新:
将方法 overridingFunct()
更改为 protected 可解决此问题。但是如果我需要重写一个公共(public)方法怎么办?这是允许的吗?我正在使用 Spring 3.2.8
更新 2:
嗯,我没明白为什么重写抽象父类中的公共(public)方法会导致 ClassCastException。作为解决方案,我执行了以下操作:创建了一个接口(interface),其中包含所有具有公共(public)逻辑的公共(public)方法,一个抽象类,它实现了该接口(interface)和所有“公共(public)”方法。然后所有子 bean 都从该抽象类扩展,实现其特定逻辑。
最佳答案
对于可能遇到此错误的任何人,以下内容可能对调试此错误很有用。首先,问题可能是由于依赖过度包含导致类加载器加载特定类的两个副本引起的。
通过 IDE 或通过
向您的 JVM 提供以下选项java -verbose:class {rest of your args / options}
然后,监视特定父类的控制台输出。该类有可能两次进入 ClassLoader,可能是通过多次包含特定的依赖项。请特别注意从查找中检索到 bean 的时间。
我在 2022 年 4 月 22 日解决了一个问题,方法是使用上述策略来追踪我们的 Gradle 构建脚本中导致额外文件进入 WAR 的问题。
关于java - ClassCastException : com. sun.proxy.$ProxyX 无法转换为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52932135/
我有一个 Spring bean(ChildBean extends Parent),它正在扩展一个抽象类(Parent implements Runnable)。 public abstract c
在我的 java 类中,我有: @Autowired @Qualifier("customerProviderExec") private DefaultCustomerProvider custom
我是一名优秀的程序员,十分优秀!