我对Java中的泛型有点新意。我遇到了以下情况,我不明白为什么代码不起作用。
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>();
Map<String,String> entry = new HashMap<String,String>();
smsListEntry.put("1", "abc");
smsListEntry.put("2", "xyz");
listEntries.add(entry);
它给我一个编译时错误,如:
add(capture#1-of ? extends Map<String,String>)
类型中的方法List<capture#1-of ? extends Map<String,String>>
不适用于参数(Map<String,String>
)
答案 0 :(得分:3)
想象一下,如果你改变了
Map<String,String> entry = new HashMap<String,String>();
到
Map<String,String> entry = new TreeMap<String,String>();
现在,您已向TreeMap
ArrayList
添加了HashMap
。
抛弃通配符,并使用您真正想要的通用参数。
List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();
更新:为了使其更加明确,图片会使用原始泛型引用ArrayList
。
List<HashMap<String,String>> orig = new ArrayList<HashMap<String,String>>();
List<? extends Map<String, String>> listEntries = orig;
listEntries.add(new TreeMap<>()); // Shouldn't work!
HashMap<String,String> treeMap = orig.get(0); // Oops!
答案 1 :(得分:2)
试试这个。
List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();
Map<String,String> entry = new HashMap<String,String>();
entry.put("1", "abc");
entry.put("2", "xyz");
listEntries.add(entry);
System.out.println(listEntries);
答案 2 :(得分:0)
基本上,List<? extends Map<...>
表示“我的列表限制为包含一些扩展Map
的类型,但我不知道确切的类型”。现在假设确切的类型实际上是TreeMap
:有意义的是,您不能将HashMap
放入此列表中。
一般来说,如果您有一些Type<E>
并且声明Type<? extends X> var
,则永远不会允许您在var
上调用任何以E
为参数的方法,因为编译器无法确定?
允许的内容(可能是X
,但可能只是X
的某个子类型)。这就是为什么你不能在这里打电话给add
。
答案 3 :(得分:-1)
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>();
你应该把它写成
List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();
您应该使用条目Interface。
来定义列表类型然后使用它:
Map<String,String> entry = new HashMap<String,String>();
entry.put("1", "abc");
entry.put("2", "xyz");
listEntries.add(entry);
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map