Java Casting问题

时间:2009-12-21 12:35:38

标签: java generics casting

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));
}

在我看来,这种手动转换应该有办法,但我无法弄清楚如何。任何想法?

4 个答案:

答案 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)。