1

我正在尝试构建一个地图,它的值可以是班级人员、动物或字符串的列表,然后我在最后阅读它。

我有以下问题:

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. 为什么不使用没有参数的 Map,为什么使用泛型和带通配符的泛型,我确实读过它,但仍然不清楚

我想在没有 pojo 的情况下尝试这种方法。或 pojo 是必要的。

请帮助,您的帮助将不胜感激。

谢谢

4

2 回答 2

2

如果您使用泛型,则无需显式转换从列表中读取的对象

假设Map<String, Animal> map...thenmap.get("someKey");将返回一个Animal.

在您的一些更复杂的示例中也是如此。

当您将不同类型的对象放入Maps 时,就会出现问题。听起来您需要 POJO 而不是Map;

class Stuff {

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

 // Getters and setters

}

这将更清洁,并且根据我对您问题的理解,似乎符合您的需要。只是传递Stuff而不是 a Map,在这种情况下它似乎不适合您的需求。

于 2012-08-11T05:38:44.193 回答
0

这种方法不好,因为演员表不安全。强制转换List<Person>不会检查列表中的所有项目是否都是 type PersonClassCastException当您尝试检索不是 a 的元素时,您会得到a Person

您应该 1) 考虑是否真的需要将这些列表放入Map. 2)如果这样做,您可以在从地图中获取列表后复制列表(如果它们不是很大):

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

但是,当然不会在源列表中完成对列表的更新。

于 2012-08-12T10:58:52.800 回答