Java 嵌套泛型和通配符

Java 嵌套泛型和通配符,java,generics,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");

在这个话题上,我看到了几个问题,但仍然不知道如何解决这个问题。我将变量定义并初始化为:

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);
报告编译错误:找不到适用于addMap的方法

编辑:

我认为这与不同,因为泛型没有嵌套在这个问题中

此外,公认的答案告诉我们,在某些声明中可以省略模板类的特定实现。您不会在标记为重复的问题上找到此教学。

?表示未知类型。由于类型未知,编译器无法保证该类型为映射。因此,它拒绝让您在队列中添加任何内容,因为这可能会影响其类型安全性

您的变量应声明为

Queue<Map<String, String>> q = new LinkedList<Map<String, String>>();
或者简单地说,如果您使用的是Java7或更高版本

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

令人惊叹的当然我不知道现在我可以推迟宣布实施map。非常感谢。