获取类转换异常,其中两个类完全相同

时间:2010-03-03 14:19:12

标签: java classcastexception

我正在做一个JBoss SEAM项目,当我查看表单时,我收到了这个错误。

java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav

它总是与屏幕上显示的形式相关的JPA类,它对我来说没有意义,为什么它是同一个类,似乎不可能。

5 个答案:

答案 0 :(得分:36)

当两个不同的ClassLoader对象加载具有相同名称的类时,会发生这种情况。 Java中两个类的相等性取决于完全限定名称加载它的类加载器。

因此,如果两个独立的类加载器从同一位置加载类,那么这些类型的对象将无法转换为彼此类型,即使它们的类被调用相同。

答案 1 :(得分:7)

正如Joachim先前解释的那样,当两个类加载器加载具有相同名称的类时,通常会发生java.lang.ClassCastException。但是,当发生这种情况时,我遇到了另一种情况。

某些IDE可能会自动重新加载已修改的类。在这种情况下,可能会在内存中保留较旧版本的类,从而导致ClassCastException。

以下是解决此问题的几种方法:

  1. 如果您正在编写自定义类加载器,则在加载类时,请确保基类/默认类加载器尚未加载该类的实例。

  2. 使正在加载的类成为已由默认类加载器加载的类的子类。

  3. 使正在加载的类实现一个已由默认类加载器加载的接口。

  4. 此处有更多信息 - http://www.jspwiki.org/wiki/A2AClassCastException

答案 2 :(得分:5)

这是因为该类已由两个不同的类加载器加载。你不能在他们之间施放。

您可能在应用程序中获得了CsiTipoLav的副本,并且在不同的类加载器的不同时间加载了两个不同的副本。 JBoss在层次结构中有许多不同的类加载器,并且很容易让事情发生变化。

确保您只有一个班级副本。

答案 3 :(得分:2)

您尝试投射的对象由不同的类加载器加载,而不是加载了您要加入的类的类加载器。

答案 4 :(得分:2)

在我的情况下,我有两个不同的* .ear,并希望从另一个加载一个类。 所以我不得不隔离类加载器。我用过这个描述:

http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS

它对我有用。