带有映射通配符的java泛型

带有映射通配符的java泛型,java,generics,map,wildcard,Java,Generics,Map,Wildcard,我试图建立一个地图,它的值可以是一个类的人,动物或字符串的列表,然后我在最后阅读它 我有以下问题: Map<String,List<? extends Object>> someDataMap = new LinkedHashMap<String,List<? extends Object>>(); Person p = new Person(); Animals a = new Animals(); List<Person> p

我试图建立一个地图,它的值可以是一个类的人,动物或字符串的列表,然后我在最后阅读它

我有以下问题:

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

Map如果使用泛型,则不需要显式强制转换从列表中读取的对象

假设
Map-Map…
然后
Map.get(“someKey”)
将返回一个
动物

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

当您将不同类型的对象放入
Map
s中时,会出现问题。听起来你需要的是POJO,而不是地图

class Stuff {

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

 // Getters and setters

}
类内容{
私人名单;
私人动物名录;
私人名单数据;
//接球手和接球手
}

这会更干净,从我对你问题的理解来看,似乎符合你的需要。只需传递
内容
,而不是
地图
,这似乎不适合您在这种情况下的需要。

这种方法不好,因为类型转换不安全。转换为
列表
不会检查列表中的所有项目是否为
个人
类型。当您试图检索一个不是
人的元素时,会得到一个
ClassCastException

你应该 1)考虑你是否真的需要把这些列表放在<代码>地图< /代码>中。 2) 如果您这样做,您可以在从地图中获取列表后复制它们(如果它们不是很大):

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

但是当然,在源代码列表中不会对列表进行更新。

谢谢您的回答,我想获得更多答案。我试图了解如何有效地使用列表泛型的要点是它们包含相同类型的元素,因此当您从它们中获取()值时,不必强制转换它们。如果你需要明确的案例,你最好想一个更好的解决方案。有时,一个简单的带有三个列表的
POJO
可以省去很多麻烦,并产生更干净的代码。