Java的泛型问题

art*_*rxe 3 java generics map

这是我的代码片段:

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

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

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

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

Rav*_*yal 10

泛型类型指定为

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

当你说它Map<String, ? extends Object>意味着一个Map键的类型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!
Run Code Online (Sandbox Code Playgroud)

如果这是允许的,你只是规避了仿制药提供的类型安全性.