Получение исключения приведения класса, когда оба класса абсолютно одинаковы - PullRequest
21 голосов
/ 03 марта 2010

Я делаю проект JBoss SEAM, и когда я просматриваю форму, я получаю эту ошибку.

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

Это всегда тот же самый класс JPA, который связан с формой, показанной на экране, мне не имеет смысла, почему это тот же класс, это кажется невозможным.

Ответы [ 5 ]

36 голосов
/ 03 марта 2010

Это происходит, когда два разных объекта ClassLoader загружают классы с одинаковыми именами. Равенство двух классов в Java зависит от полностью определенного имени и загрузчика классов, который его загрузил.

Таким образом, если два независимых загрузчика классов загружают классы из одного и того же местоположения, то объекты этих типов не смогут быть преобразованы в другие типы, даже если их классы называются одинаковыми.

7 голосов
/ 27 сентября 2011

Как объяснил ранее Йоахим, java.lang.ClassCastException обычно возникает, когда два загрузчика классов загружают классы с одинаковыми именами. Однако я столкнулся с другой ситуацией, когда это могло произойти.

Это может произойти с некоторыми IDE, которые автоматически перезагружают измененные классы. В таких случаях могут быть более старые версии класса, сохраненные в памяти, вызывающие ClassCastException.

Вот несколько способов решить эту проблему:

  1. Если вы пишете пользовательский загрузчик классов, при загрузке класса убедитесь, что в загрузчике базового / по умолчанию класса еще не загружен экземпляр этого класса.

  2. Сделать загружаемый класс подклассом класса, который уже загружен загрузчиком классов по умолчанию.

  3. Заставить загружаемый класс реализовать интерфейс, который уже загружен загрузчиком классов по умолчанию.

Подробнее здесь - http://www.jspwiki.org/wiki/A2AClassCastException

5 голосов
/ 03 марта 2010

Это потому, что класс был загружен двумя разными загрузчиками классов. Вы не можете разыгрывать между ними.

Вероятно, у вас есть дубликат копии CsiTipoLav в вашем приложении, и две разные копии загружаются в разное время из разных загрузчиков классов. JBoss имеет множество различных загрузчиков классов в иерархии, и легко получить вещи в поворот.

Убедитесь, что у вас есть только одна копия класса.

2 голосов
/ 30 августа 2013

В моем случае у меня было два разных * .ear и я хотел загрузить класс из другого. Поэтому я должен был изолировать загрузчик классов. Я использовал это описание:

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

Это сработало для меня.

2 голосов
/ 03 марта 2010

Объект, который вы пытаетесь привести, загружается загрузчиком классов, отличным от того, который загрузил класс, в который вы пытаетесь привести.

...