2009-12-21 130 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)。