这是我的代码段:
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
的子类型,我认为错误没有任何理由出现。我在哪里误解了这个问题?
答案 0 :(得分:10)
将 generics 类型指定为
Map<String, Object> data = this.aub.getData();
data.put("ip_macs", new LinkedList<Object>()); // Compiles
当您说Map<String, ? extends Object>
时,它表示Map
,其密钥的类型为String
,值为Object
,但其类型为 unknown ?
。因为,类型未知,在那里插入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!
如果允许这样做,你只是规避了仿制药提供的类型安全性。