我正在做一个JBoss SEAM项目,当我查看表单时,我收到了这个错误。
java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav
它总是与屏幕上显示的形式相关的JPA类,它对我来说没有意义,为什么它是同一个类,似乎不可能。
答案 0 :(得分:36)
当两个不同的ClassLoader
对象加载具有相同名称的类时,会发生这种情况。 Java中两个类的相等性取决于完全限定名称和加载它的类加载器。
因此,如果两个独立的类加载器从同一位置加载类,那么这些类型的对象将无法转换为彼此类型,即使它们的类被调用相同。
答案 1 :(得分:7)
正如Joachim先前解释的那样,当两个类加载器加载具有相同名称的类时,通常会发生java.lang.ClassCastException。但是,当发生这种情况时,我遇到了另一种情况。
某些IDE可能会自动重新加载已修改的类。在这种情况下,可能会在内存中保留较旧版本的类,从而导致ClassCastException。
以下是解决此问题的几种方法:
如果您正在编写自定义类加载器,则在加载类时,请确保基类/默认类加载器尚未加载该类的实例。
使正在加载的类成为已由默认类加载器加载的类的子类。
使正在加载的类实现一个已由默认类加载器加载的接口。
答案 2 :(得分:5)
这是因为该类已由两个不同的类加载器加载。你不能在他们之间施放。
您可能在应用程序中获得了CsiTipoLav
的副本,并且在不同的类加载器的不同时间加载了两个不同的副本。 JBoss在层次结构中有许多不同的类加载器,并且很容易让事情发生变化。
确保您只有一个班级副本。
答案 3 :(得分:2)
您尝试投射的对象由不同的类加载器加载,而不是加载了您要加入的类的类加载器。
答案 4 :(得分:2)
在我的情况下,我有两个不同的* .ear,并希望从另一个加载一个类。 所以我不得不隔离类加载器。我用过这个描述:
http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS
它对我有用。