嵌套泛型和通配符

时间:2014-10-05 12:55:06

标签: java generics

我已经看到了关于这个主题的几个问题,但仍然无法弄清楚如何解决这个问题。我将变量定义并初始化为:

Queue<? extends Map<String, String>> q = new LinkedList<HashMap<String, String>>();

它编译。但那时:

Map<String, String> m = new HashMap<String, String>();
m.put("foo", "bar"); 
q.add(m);

报告编译错误:no suitable method found for add(Map<String,String>)

编辑:

我认为这与Can't add value to the Java collection with wildcard generic type不同,因为泛型不会嵌套在该问题中。

此外,接受的答案教导在某些声明中可以省略模板类的具体实现。你不会在标记为重复的问题上找到这种教学。

1 个答案:

答案 0 :(得分:0)

?表示&#34;未知类型&#34;。由于类型未知,编译器无法保证类型为Map<String, String>。所以它拒绝让你在队列中添加任何东西,因为它可能会损害它的类型安全性。

您的变量应声明为

Queue<Map<String, String>> q = new LinkedList<Map<String, String>>();

或简单地说,如果您使用的是Java 7或更高版本

Queue<Map<String, String>> q = new LinkedList<>();