2009-12-21 67 views
0

为什么不是Map<String,List<SomeBean>> castable到Map<String,List<?>>Java Casting Problem

我现在正在做的是这样的:

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

它适用于我的JDK 6 Eclipse .. – Bozho 2009-12-21 12:44:19

+0

如果演员在Eclipse中工作,我会感到非常惊讶。你在谈论给定的片段吗? – Jerome 2009-12-21 12:52:57

+0

是的,我的意思是代码段的作品.. – Bozho 2009-12-21 12:59:11

回答

5

演员是无效的,因为在地图<字符串,列表<? > >你可以把清单<字符串>和List <什么>,但不是在地图<字符串,列表<SomeBean> >。

例如:

//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); 
+0

啊..现在它确实有道理!非常感谢你的解释! – cimnine 2009-12-21 13:01:51

1

如果你真的想,你可以转换为原始地图(但你想要的是不是类型安全):

Map<String,List<?>> toMap = (Map) new LinkedHashMap<String, List<String>>(); 
+0

如果你确定地图类型,我会建议你这样做。这是丑陋的,但它的工作原理。 – 2009-12-22 04:30:28

3

不是真的回答你的问题,但作为一个额外的:我不会在这里使用键集...如果你想遍历地图的所有元素,使用entrySet()方法。它的速度更快,因为它不需要每个元素的键值查找。

for (Map.Entry<String, List<SomeBean>> entry : fromMap.entrySet()) { 
    toMap.put(entry.getKey(), entry.getValue()); 
} 
+0

很高兴知道,谢谢! – cimnine 2009-12-21 12:57:34

1

当分配到一个地图,其中K和V都没有通配符参数,该地图被分配必须具有完全相同的K和V.在你的情况,V必须完全List<?>

解决方法为使用通配符五

Map<String, ? extends List<?>> map = new LinkedHashMap<String, List<String>>(); 因为你分配给V是一个通配符,在V被分配必须只分配给V(而不是恰好V)。