Map<String,List<SomeBean>>
Map<String,List<?>>
无法投放?
我现在正在做的是:
Map<String, List<SomeBean>> fromMap = new LinkedHashMap<String, List<SomeBean>>();
/* filling in data to fromMap here */
Map<String,List<?>> toMap = new LinkedHashMap<String, List<?>>();
for (String key : fromMap.keySet()) {
toMap.put(key, fromMap.get(key));
}
在我看来,这种手动转换应该有办法,但我无法弄清楚如何。任何想法?
答案 0 :(得分:5)
演员表无效,因为在Map&lt; String,List&lt;?&gt;&gt;你可以把List&lt; String&gt;和List&lt; WhatEver&gt;,但不在Map&lt; String,List&lt; SomeBean&gt;&gt;。
例如:
//List<SomeBean> are ok in both lists
fromMap.put("key", new ArrayList<SomeBean>());
toMap.put("key", new ArrayList<SomeBean>());
//List<String> are ok in Map<String,List<?>>, not in Map<String, List<SomeBean>>
fromMap.put("key", new ArrayList<String>()); //DOES NOT COMPILE
toMap.put("key", new ArrayList<String>());
为了简化代码,您可以使用适当的构造函数来简化代码:
Map<String, List<SomeBean>> fromMap = new LinkedHashMap<String, List<SomeBean>>();
Map<String,List<?>> toMap = new LinkedHashMap<String, List<?>>(fromMap);
答案 1 :(得分:3)
不是你的问题的答案,但作为一个额外的:我不会在这里使用键集...如果你想迭代地图的所有元素,使用entrySet()方法。它更快,因为它不需要对每个元素进行键值查找。
for (Map.Entry<String, List<SomeBean>> entry : fromMap.entrySet()) {
toMap.put(entry.getKey(), entry.getValue());
}
答案 2 :(得分:1)
如果你真的想要,你可以投射到原始地图(但你想要的不是类型安全的):
Map<String,List<?>> toMap = (Map) new LinkedHashMap<String, List<String>>();
答案 3 :(得分:1)
当分配到地图时,其中K和V不是通配符参数,被分配的地图必须具有完全相同的K和V.在您的情况下,V必须完全是List<?>
。
使用通配符V。
的解决方法 Map<String, ? extends List<?>> map = new LinkedHashMap<String, List<String>>();
由于您要分配的V是通配符,因此分配的V必须只能分配给V(而不是V)。