无法将通用列表添加到通用映射

时间:2018-04-06 04:16:16

标签: java generics

我有一张通用地图

Map<String, List<A<?>>> map = new HashMap<>();

然后我有一个列表:

List<A<Integer>> list1 = getData();
List<A<String>> list2 = getData2();

我正在尝试将它们添加到地图中,但我收到的错误是说这个论点是错误的。

map.put("a", list1);
map.put("b", list2);
//doesn't work

制作地图

Map<String, List<A>> map = HashMap<>();

也不起作用。 如何更改“地图”以便能够添加这两个列表?

2 个答案:

答案 0 :(得分:3)

泛型不会递归评估。通配符(<?>)未在此处进行评估。

如果您有Map<String, List<A<?>>>,那么必须为其添加List<A<?>>值; List<A<Integer>>不符合List<A<?>>的条件。 List<A<?>>表示具有未知类型的实例列表,因此您必须传递具有未知类型的A实例列表。

你可以做的是明确地创建这样一个List,并将你输入的A List的所有元素添加到它:

List<A<Integer>> list1 = getData();
List<A<String>> list2 = getData2();

List<A<?>> list1Unknown = new ArrayList<>();
list1.forEach(list1Unknown::add);

List<A<?>> list2Unknown = new ArrayList<>();
list2.forEach(list2Unknown::add);

map.put("a", list1Unknown);
map.put("b", list2Unknown);

答案 1 :(得分:-2)

如果您只想在地图中放置任意两个列表,请使用:Map<String, List> map = new HashMap<>();

或者,如果要限制要添加的列表类型:

Map<String, List<? extends Object>> map = new HashMap<>();

为什么我选择扩展Object是因为它是IntegerString层次结构中唯一存在的类。