Как объект может быть приведен как к List, так и к MyBean

#java

#java

Вопрос:

Я пишу тестовые примеры, и у меня возникают трудности с пониманием того, как объект может быть приведен к List.class и MyBean.class. Единственный способ, которым я вижу, что это возможно, заключается в том, что MyBean.class является сериализуемым.

 if (message.getBody(List.class).isEmpty())
            throw new GenericException("array is empty");

MyBean myBean1 = message.getBody(MyBean.class);

if (myBean1.getParam1() != null amp;amp; !myBean1.getParam1().isEmpty()) {
    //unreachable code here
}
  

Если бы кто-нибудь мог пролить некоторый свет на этот вопрос, я бы высоко оценил это.

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

     String myBeanJsonFormat= "{"  
            "  "search": ["  
            "    {"  
            "      "operation": "equal","  
            "      "path": "/core/creator","  
            "      "value": "aValue","  
            "      "match": "/core/modifiedBy" "  
            "    }"  
            "  ]"  
            "}";
    ObjectMapper objectMapper = new ObjectMapper();
    MyBean myBeanTest= objectMapper.readValue(myBeanJsonFormat, MyBean.class);
    assert myBeanTest.getParam1() != null; //pass

    List myBeanListTest = (List) myBeanTest; //classCastException below
    //java.lang.ClassCastException: myPackage.MyBean cannot be cast to java.util.List

    byte[] test = SerializationUtils.serialize(myBeanJsonFormat);
    MyBean myBeanTest1 = SerializationUtils.deserialize(test);
    assert myBeanTest1.getSearchOperations()!=null; //ERROR: Exception below
    //java.lang.ClassCastException: java.lang.String cannot be cast to mypackage.MyBean
  

Просто для ясности, моя цель — выяснить, что я должен задать для тела сообщения, чтобы этот код функционировал правильно.

Я могу передать список, чтобы пройти проверку списка, но я не могу затем передать приведение MyBean.

Я могу передать строку в формате массива json, при этом передается приведение списка, но не приведение MyBean.

Если я закомментирую оператор List cast if, я могу просто пройти через объект MyBean без проблем.

Комментарии:

1. MyBean реализует List, что сделало бы это возможным.

2. Не уверен, что именно вы хотите сделать, но, возможно, это руководство поможет вам в этом

3. Что такое message.getBody ? Является ли это частью какой-то общей библиотеки? Если это какой-то фреймворк десериализации, очень возможно, что одно и то же сообщение может быть преобразовано в несколько альтернативных типов Java.

4. message.getBody(List.class) и message.getBody(MyBean.class) не похоже, что они возвращают один и тот же объект, даже для одного и того же message .

Ответ №1:

Вы должны изменить List myBeanListTest = (List) myBeanTest; вместо этого List ob = Arrays.asList(myBeanTest); , тогда ваша проблема ClassCastException будет решена.

Ответ №2:

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

Из-за интерфейсов

Давайте создадим класс, который реализует интерфейс List

 public class myClass extends MyBean implements List {
  

Затем экземпляр MyClass может быть приведен к MyBean или к List

Из-за каскадного подкласса

Если класс MyBean расширяет класс MySuperBean

 public class MyBean extends MySuperBean {
  

Затем подкласс MyBean

 public class MyClass extends MySuperBean {
  

Затем экземпляр MyClass может быть приведен либо к MyBean, либо к MySuperBean