2013-08-20 2 views
2

Мой код:не может бросить объект HashMap

Object res = stub.call(sessionId, "sale.list", "11111"); 
HashMap<String, String> map = (HashMap<String, String>) res; 

Преобразование объекта в HashMap я получил следующие исключения

Exception in thread "main" java.lang.ClassCastException: [Ljava.util.HashMap; 
cannot be cast to java.util.HashMap 

Может кто-нибудь помочь мне, как получить данные объекта?

ответ

5

Вы можете отливать res до HashMap, только если stub.call(sessionId, "sale.list", "11111") возвращает объект HashMap.

[Ljava.lang.HashMap; указывает, что то, что вы получаете, представляет собой массив hashMap, а не один HashMap.

1
Object res = stub.call(sessionId, "sale.list", "11111"); 

Теперь, если вы знаете, приведенный выше код возвращает java.util.Map или по крайней мере в java.util.HashMap, и это следует тем же дженерик, то вы можете бросить его на карту. Или, как минимум, он должен вернуть нуль.

Map<String, String> map = (Map<String, String>) res; 
4

Вы получаете массив хэш-карт, так что приведение к массиву:

HashMap[] maps = (HashMap[]) res; 
+0

Вы спасли мой день. –

0

Если вы хотите, чтобы бросить некоторые вещи в какой-то другой стороны, вы можете знать о кастинге Java. В Java существует два типа кастомизации ссылочной переменной.

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

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

цитирую это из Java rules for casting

2

Сообщение исключение указывает, что метод stub.call(...)HashMap[] возвращается и не HashMap.

«Исправить», чтобы сделать это:

HashMap<String, String>[] maps = (HashMap<String, String>[]) res; 

Или, если вы знаете, что массив будет содержать ровно один элемент, то:

HashMap<String, String> map = ((HashMap<String, String>[]) res)[0]; 

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

HashMap<?, ?> map = ((HashMap<?, ?>[]) res)[0]; 
Смежные вопросы