Cannot be cast to class java io serializable

Невозможно включить в java.io.Serializable

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

Criteria criteria = sess.createCriteria(UserDetails.class) criteria.add(Restrictions.eq("user.id", user.id)); 

Я также попытался использовать;

Criteria criteria = sess.createCriteria(UserDetails.class) Criteria subCriteria = criteria.createCriteria("user"); subCriteria.add(Restrictions.eq("id", user.id)); 

Оба дают мне ClassCastException. Я знаю, что могу легко решить это, разрешив пользователю реализовать Serializable, но есть ли другое решение?

ОТВЕТЫ

Ответ 1

Единственное другое решение — реализовать Externalizable.

Ответ 2

Вы должны реализовать интерфейс Serializable .

Ответ 3

Мой опыт был таким. У меня была цепочка отношений между родителями и детьми. Затем меня заставили реорганизовать. Во время процесса я не смог правильно обновить все мои аннотации. То есть, когда я начал получать бросок в Serializable error. Я реализовал Serializable, и это выявило реальные проблемы. Когда все работает, я смог удалить Serializable.

Итак, в ответ на ваш вопрос, реальная проблема может быть в вашей настройке, а Hibernate пытается обойти проблемы путем сериализации определенных объектов. Попробуйте временно реализовать Serializable, чтобы выявить проблемы, а затем удалить его.

Источник

Объяснение ClassCastException в Java

ClassCastException — это непроверенное исключение , которое сигнализирует о том, что код попытался привести ссылку к типу, подтипом которого он не является .

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

2. Явный кастинг​

Для наших следующих экспериментов рассмотрим следующие классы:

 public interface Animal    String getName();   > 
 public class Mammal implements Animal    @Override   public String getName()    return "Mammal";   >   > 
 public class Amphibian implements Animal    @Override   public String getName()    return "Amphibian";   >   > 
 public class Frog extends Amphibian    @Override   public String getName()    return super.getName() + ": Frog";   >   > 

2.1. Классы кастинга​

На сегодняшний день наиболее распространенным сценарием возникновения ClassCastException является явное приведение к несовместимому типу.

Например, давайте попробуем привести лягушку к млекопитающему :

 Frog frog = new Frog();   Mammal mammal = (Mammal) frog; 

Мы могли бы ожидать здесь ClassCastException , но на самом деле мы получаем ошибку компиляции: «несовместимые типы: лягушка не может быть преобразована в млекопитающее». Однако ситуация меняется, когда мы используем общий супертип:

 Animal animal = new Frog();   Mammal mammal = (Mammal) animal; 

Теперь мы получаем ClassCastException из второй строки:

 Exception in thread "main" java.lang.ClassCastException: class Frog cannot be cast to class Mammal (Frog and Mammal are in unnamed module of loader 'app')  at Main.main(Main.java:9) 

Проверенное нисходящее приведение к Mammal несовместимо со ссылкой Frog, потому что Frog не является подтипом Mammal . В этом случае компилятор нам помочь не сможет, так как переменная Animal может содержать ссылку совместимого типа.

Интересно отметить, что ошибка компиляции возникает только тогда, когда мы пытаемся выполнить приведение к однозначно несовместимому классу. То же самое не верно для интерфейсов, потому что Java поддерживает множественное наследование интерфейсов, но только одиночное наследование для классов. Таким образом, компилятор не может определить, реализует ли ссылочный тип конкретный интерфейс или нет. Приведем пример:

 Animal animal = new Frog();   Serializable serial = (Serializable) animal; 

Мы получаем ClassCastException во второй строке вместо ошибки компиляции:

 Exception in thread "main" java.lang.ClassCastException: class Frog cannot be cast to class java.io.Serializable (Frog is in unnamed module of loader 'app'; java.io.Serializable is in module java.base of loader 'bootstrap')  at Main.main(Main.java:11) 

2.2. Приведение массивов​

Мы видели, как классы обрабатывают приведение типов, теперь давайте посмотрим на массивы. Приведение массивов работает так же, как приведение классов. Однако нас может запутать автоупаковка и продвижение шрифта или их отсутствие.

Итак, давайте посмотрим, что происходит с примитивными массивами, когда мы пытаемся выполнить следующее приведение:

 Object primitives = new int[1];   Integer[] integers = (Integer[]) primitives; 

Вторая строка генерирует исключение ClassCastException , так как автоупаковка не работает для массивов.

Как насчет продвижения типа? Давайте попробуем следующее:

 Object primitives = new int[1];   long[] longs = (long[]) primitives; 

Мы также получаем ClassCastException , потому что повышение типа не работает для целых массивов.

2.3. Безопасный кастинг​

В случае явного приведения настоятельно рекомендуется проверить совместимость типов перед попыткой приведения с использованием instanceof .

Давайте посмотрим на пример безопасного приведения:

 Mammal mammal;   if (animal instanceof Mammal)    mammal = (Mammal) animal;   > else    // handle exceptional case   > 

3. Загрязнение кучи​

В соответствии со спецификацией Java : « Загрязнение кучи может произойти только в том случае, если программа выполнила какую-либо операцию с необработанным типом, которая привела бы к непроверенному предупреждению во время компиляции».

Для нашего эксперимента рассмотрим следующий универсальный класс:

 public static class Box    private T content;    public T getContent()    return content;   >    public void setContent(T content)    this.content = content;   >   > 

Теперь попробуем загрязнить кучу следующим образом:

 BoxLong> originalBox = new Box>();   Box raw = originalBox;  raw.setContent(2.5);   BoxLong> bound = (BoxLong>) raw;   Long content = bound.getContent(); 

Последняя строка вызовет исключение ClassCastException , поскольку она не может преобразовать двойную ссылку в Long .

4. Общие типы​

При использовании дженериков в Java мы должны опасаться стирания типов , что также может привести к ClassCastException в некоторых условиях.

Рассмотрим следующий общий метод:

 public static T> T convertInstanceOfObject(Object o)    try    return (T) o;   > catch (ClassCastException e)    return null;   >   > 
 String shouldBeNull = convertInstanceOfObject(123); 

На первый взгляд, мы можем разумно ожидать, что из блока catch будет возвращена нулевая ссылка. Однако во время выполнения из-за стирания типа параметр приводится к Object вместо String . Таким образом, перед компилятором стоит задача присвоить Integer String , что вызовет исключение ClassCastException.

5. Вывод​

В этой статье мы рассмотрели ряд распространенных сценариев неуместного кастинга.

Неявное или явное приведение ссылок Java к другому типу может привести к ClassCastException , если только целевой тип не является тем же или потомком фактического типа .

Код, использованный в этой статье, можно найти на GitHub .

Источник

Объяснение ClassCastException в Java

Давайте подробнее рассмотрим исключение ClassCastException.

1. Обзор

В этом коротком уроке мы сосредоточимся на ClassCastException , общем исключении Java .

ClassCastException – это непроверенное исключение , которое сигнализирует о том, что код попытался привести ссылку на тип, к которому он не является подтипом .

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

2. Явный Кастинг

Для наших следующих экспериментов рассмотрим следующие классы:

public class Mammal implements Animal < @Override public String getName() < return "Mammal"; >>
public class Amphibian implements Animal < @Override public String getName() < return "Amphibian"; >>
public class Frog extends Amphibian < @Override public String getName() < return super.getName() + ": Frog"; >>

2.1. Классы литья

Безусловно, наиболее распространенный сценарий встречи с ClassCastException явно приводит к несовместимому типу.

Например, давайте попробуем бросить Лягушку в Млекопитающее :

Frog frog = new Frog(); Mammal mammal = (Mammal) frog;

Мы могли бы ожидать здесь ClassCastException , но на самом деле мы получаем ошибку компиляции: “несовместимые типы: Лягушка не может быть преобразована в млекопитающее”. Однако ситуация меняется, когда мы используем общий супертип:

Animal animal = new Frog(); Mammal mammal = (Mammal) animal;

Теперь мы получаем ClassCastException из второй строки:

Exception in thread "main" java.lang.ClassCastException: class Frog cannot be cast to class Mammal (Frog and Mammal are in unnamed module of loader 'app') at Main.main(Main.java:9)

Проверенное значение Mammal несовместимо со ссылкой Frog , поскольку Frog не является подтипом Mammal . В этом случае компилятор не может нам помочь, так как переменная Animal может содержать ссылку совместимого типа.

Интересно отметить, что ошибка компиляции возникает только тогда, когда мы пытаемся привести к однозначно несовместимому классу. То же самое не относится к интерфейсам, поскольку Java поддерживает наследование нескольких интерфейсов, но только одно наследование для классов. Таким образом, компилятор не может определить, реализует ли ссылочный тип определенный интерфейс или нет. Давайте приведем пример:

Animal animal = new Frog(); Serializable serial = (Serializable) animal;

Мы получаем ClassCastException во второй строке вместо ошибки компиляции:

Exception in thread "main" java.lang.ClassCastException: class Frog cannot be cast to class java.io.Serializable (Frog is in unnamed module of loader 'app'; java.io.Serializable is in module java.base of loader 'bootstrap') at Main.main(Main.java:11)

2.2. Литейные массивы

Мы видели, как классы обрабатывают приведение, теперь давайте посмотрим на массивы. Приведение массива работает так же, как и приведение класса. Однако мы можем запутаться в автобоксах и продвижении типов или их отсутствии.

Таким образом, давайте посмотрим, что происходит с примитивными массивами, когда мы пытаемся выполнить следующее приведение:

Object primitives = new int[1]; Integer[] integers = (Integer[]) primitives;

Вторая строка вызывает исключение ClassCastException as autoboxing не работает для массивов.

Как насчет продвижения по службе? Давайте попробуем следующее:

Object primitives = new int[1]; long[] longs = (long[]) primitives;

Мы также получаем исключение ClassCastException , потому что продвижение типа не работает для целых массивов.

2.3. Безопасное литье

В случае явного приведения настоятельно рекомендуется проверить совместимость типов перед попыткой приведения с помощью instanceof .

Давайте рассмотрим пример безопасного приведения:

Mammal mammal; if (animal instanceof Mammal) < mammal = (Mammal) animal; >else < // handle exceptional case >

3. Загрязнение Кучи

В соответствии со спецификацией Java : ” Загрязнение кучи может произойти только в том случае, если программа выполнила какую-либо операцию с использованием необработанного типа, которая приведет к появлению непроверенного предупреждения во время компиляции”.

Для нашего эксперимента рассмотрим следующий универсальный класс:

public static class Box  < private T content; public T getContent() < return content; >public void setContent(T content) < this.content = content; >>

Теперь мы попытаемся загрязнить кучу следующим образом:

Box originalBox = new Box<>(); Box raw = originalBox; raw.setContent(2.5); Box bound = (Box) raw; Long content = bound.getContent();

Последняя строка вызовет исключение ClassCastException , поскольку она не может преобразовать ссылку D ouble в Long .

4. Общие типы

При использовании дженериков в Java мы должны быть осторожны с стиранием типов , что также может привести к ClassCastException в некоторых условиях.

Давайте рассмотрим следующий общий метод:

public static T convertInstanceOfObject(Object o) < try < return (T) o; >catch (ClassCastException e) < return null; >>

А теперь давайте назовем это:

String shouldBeNull = convertInstanceOfObject(123);

На первый взгляд, мы можем разумно ожидать нулевую ссылку, возвращаемую из блока catch. Однако во время выполнения из-за стирания типа параметр приводится к Object вместо String . Таким образом , компилятор сталкивается с задачей присвоения целого числа | строке , которая вызывает исключение ClassCastException.

5. Заключение

В этой статье мы рассмотрели ряд распространенных сценариев неподходящего кастинга.

Независимо от того, явные или неявные, приведение ссылок Java к другому типу может привести к ClassCastException , если целевой тип не совпадает или не является потомком фактического типа .

Код, используемый в этой статье, можно найти на GitHub .

Читайте ещё по теме:

Источник

Читайте также:  Program exercises in java
Оцените статью