2016-08-15 2 views
2

Я должен это знать, но почему-то я не могу это понять.листинг Список <Object> в список <Карта <String, Object >>

Почему я не могу перечислить список объектов List<Object> в список карт List<Map<String, Object>>? Каждый объект в списке является объектом типа Map<String, Object>, поэтому почему кастинг невозможен?

Что я могу сделать, это создать new ArrayList<Map<String, Object>>(); и перебрать список и добавить каждый элемент в список.

List<Object> dataList; 
.. 
//Why doesn't this work? 
List<Map<String, Object>> rxData = (List<Map<String, Object>>)dataList; 

//This works, but is there a better way? 
rxData = new ArrayList<Map<String, Object>>(); 
for (Object data : dataList) { 
    rxData.add((Map<String, Object>)data); 
} 
+0

Почему? Потому что дженерики Java не подлежат оплате. Невозможно, чтобы JVM действительно проверила, что актерский состав верен. Если вы просто хотите это сделать, я думаю, что '@SuppressWarnings (" unchecked ")' является решением, хотя я не тестировал это. – markspace

+1

Java generics FAQ: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20the%20SuppressWarnings%20annotation? – markspace

ответ

3

Вы можете просто бросить общий параметр двойного литья:

@SuppressWarnings("‌​unchecked") 
List<Map<String, Object>> rxData = 
    (List<Map<String, Object>>) (List<?>) dataList; 

Что происходит здесь является то, что вы заставляете компилятор не проверять общий типа, опустив его с первым броском, а затем делать бесконтрольно отбрасывается до List<Map<String, Object>>. Это возможно, потому что java generics - это не refiable.

оригинальный ошибка вызвана тем, что Object не совместим с Map<> типа и нет такого понятия, как ковариант-/контравариантными типов в Java (в отличие от scala, например).

Но возникнут проблемы, если dataList не содержит карт.

+2

Здесь нет необходимости в сыром типе, и проблема не связана с reifiablity. –

+0

@ k5_ согласен. благодаря! но в любом случае это будет непроверено. Я отредактирую свой ответ – vsminkov

+0

Спасибо! Хорошо, думаю, я понимаю, и мне нужно осторожно, чтобы список не содержал ничего кроме карт. – Andy

4

List<Object> и List<Map<String, Object>>are not compatible types, поэтому вы не можете напрямую перекладывать один на другой. Вы бы первый бросок к к надтипу, а затем понурый:

List<Map<String, Object>> rxData = (List<Map<String, Object>>)(List<?>)dataList; 

Обратите внимание, что вы все равно получите предупреждение во время компиляции, потому что это unsafe cast.

0

Проверьте следующую ссылку

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

Два общие классы Type1 и Type2 не связаны вообще. Таким образом, вы не можете прибегать друг к другу.

Однако вы можете совершать небезопасные операции и спасать себя от цикла.

//unsafe assignments 
List rxData = (List<Map<String, Object>>)dataList; 

List<Object> dataList = (List<Object>)rxData; 
Смежные вопросы