#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