2012-08-11 57 views
1

我想構建一個地圖,它的值可以是類人,動物或字符串的列表,然後我在最後閱讀它。帶有通配符的java泛型地圖

我有以下問題:

Map<String,List<? extends Object>> someDataMap = 
new LinkedHashMap<String,List<? extends Object>>(); 

Person p = new Person(); 
Animals a = new Animals(); 

List<Person> personList = p.getPersonList(); 
List<Animals> animalsList = a.getAnimalsList(); 


List<String> someStrings = new ArrayList<String>(); 

someStrings.add("Employe123"); 
someStrings.add("Pet-Cat"); 


// putting lists into map 
someDataMap.put("person",personList); 
someDataMap.put("animals",animalsList); 
someDataMap.put("listsOfData",someStrings); 



// now reading the values. 


    Map<String,List<? extends Object>> datMap = 
    (Map<String,List<? extends Object>>)model.get("datMap"); 

List<Person> dataList = (List<Person>) datMap.get("person"); 

List<Animals> nodalList = (List<Animals>)datMap.get("animals"); 

List<String> listsOfData = (List<String>) datMap.get("listsOfData"); 
  1. 是這種做法是正確的,我的意思是把這些價值觀和閱讀。
  2. 爲什麼不使用地圖不帶參數,爲什麼使用泛型和泛型使用通配符,我沒有讀到它,我還不清楚

我想嘗試沒有一個POJO這種方法。或者pojo是必要的。

請幫助,您的幫助將不勝感激。

感謝

回答

2

如果使用泛型,你不需要從列表中

假設​​然後map.get("someKey");將返回Animal明確投你閱讀的對象。

在一些更復雜的例子中也是如此。

將不同類型的對象放入Map s時會出現問題。這聽起來像你需要一個POJO而不是Map;

class Stuff { 

    private List<Person> people; 
    private List<Animal> animals; 
    private List<String> data; 

// Getters and setters 

} 

這將是更清潔,似乎適合您的需求從我的理解您的問題。只需通過Stuff而不是Map,這似乎不符合您在這種情況下的需求。

+0

感謝您的回答,我想獲得更多答案。我想看看如何有效地使用List <?使用不同的值擴展Object>以獲得地圖值。 – Nomad 2012-08-11 05:47:43

+2

泛型'List's的一點是它們包含相同類型的元素,所以當你從它們中獲取()'值時,你不必投它們。如果你需要明確的話,你最好考慮一個更好的解決方案。有時候一個簡單的帶有三個列表的POJO可以節省很多頭痛,並且可以得到更簡潔的代碼。 – WhyNotHugo 2012-08-11 05:51:30

0

這種方法不好,因爲演員陣容不安全。投射到List<Person>將不會檢查列表中的所有項目的類型是Person。當您嘗試檢索不是Person的元素時,您會得到ClassCastException

你應該 1)考慮你是否真的需要把這些列表放在Map。 2)如果你這樣做,你可以從地圖讓他們複製後的名單(如果他們不是巨大):

List<Person> dataList = new ArrayList<Person>(datMap.get("person")); 

但當然再更新列表不會在源列表來完成的。