2016-08-15 120 views
2

我应该知道这一点,但由于某种原因我无法理解这一点。演员表<Object> to List <Map <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泛型常见问题解答: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泛型是非refiable

原始错误是由事实引起的Object不与Map<>类型兼容,并且没有像协变/逆变类型Java中没有这样的东西(不像scala例如)

但是如果dataList不包含地图,会出现问题。

+2

这里不需要原始类型,问题与可靠性无关。 –

+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

相关问题