3

这是我的代码片段:

Map<String, ? extends Object> data = this.aub.getData();
//... some code ...
data.put("ip_macs", new LinkedList<Object>()); //gets error

我在标记行得到的错误是(消息来自 Eclipse IDE):

Map 类型中的 put(String, capture#3-of ? extends Object) 方法不适用于参数 (String, LinkedList)

有谁知道为什么?只要LinkedList是 的子类型Object,我认为该错误没有任何理由出现。我在哪里误解了这个问题?

4

1 回答 1

10

将泛型类型指定为

Map<String, Object> data = this.aub.getData();
data.put("ip_macs", new LinkedList<Object>()); // Compiles

当您说它Map<String, ? extends Object>意味着 aMap其键为类型String并且值扩展Object但其类型未知 ?时。由于类型未知,因此在LinkedList此处插入对象是不安全的。

基本上,编译器试图阻止这种情况:

Map<String, String> mapOfStrings = new HashMap<String, String>();
mapOfStrings.add("string", "value");

Map<String, ? extends Object> map = mapOfStrings; // Compiles
map.add("string", 1); // ERROR!

如果允许这样做,您就绕过了泛型提供的类型安全。

于 2013-08-26T08:08:03.657 回答