将 List<Object> 转换为 List<Map<String, Object>>

And*_*ndy 2 java hashmap

我应该知道这一点,但由于某种原因我无法理解这一点。

为什么我不能将对象 List<Object>列表转换为地图列表List<Map<String, Object>>?列表中的每个对象都是 type 的对象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);
}
Run Code Online (Sandbox Code Playgroud)

vsm*_*kov 5

您可以通过双重转换来删除泛型参数:

@SuppressWarnings("??unchecked")
List<Map<String, Object>> rxData = 
    (List<Map<String, Object>>) (List<?>) dataList;
Run Code Online (Sandbox Code Playgroud)

这里的情况是,您强制编译器不检查泛型类型,方法是先将其省略,然后再进行未经检查的强制转换为List<Map<String, Object>>. 这是可能的,因为 java 泛型是不可修改的

最初的错误是由ObjectMap<>类型不兼容的事实引起的,并且在 java 中没有像协变/逆变类型这样的东西(与scalaexample不同)

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

  • 这里不需要原始类型,问题与可重构性无关。 (2认同)
  • 您应该删除答案的第一句话,或将其移到答案的后面:这是真的,但不是很相关。(不可重构性是为什么从 `List&lt;?&gt;` 到 `List&lt;Map&lt;String, Object&gt;&gt;` 的强制转换没有被选中;但这与你不能从 `List&lt;Object&gt;` 强制转换的原因无关到`List&lt;Map&lt;String, Object&gt;&gt;`。) (2认同)