如何将元素添加到Java通用通配符列表

时间:2017-06-27 08:03:46

标签: java android generics sharedpreferences wildcard

如何在同一时间将字符串和int值添加到HashMap?

HashMap<String,?> map =new HashMap<>();
map.put("sss", "str");
map.put("sss", 1);

Android SharedPreferences.getAll()方法是如何做到的?

错误消息

Found 'java.lang.String', required: '?'

2 个答案:

答案 0 :(得分:1)

您无法向null添加任何内容(文字Map<String, ?>除外),因为它可能是错误的类型。例如:

Map<String, Long> longMap = ...;
Map<String, ?> wildcardMap = longMap;
wildcardMap.put("", "");  // Compiler error!

// but if it did work, the following would be a runtime error:
Long value = longMap.values().iterator().next();

请注意,?? extends Object的简写;首字母缩写词PECS告诉你extends制作者而不是使用者的东西。因此,您无法在其实例上调用使用者方法(除非您传递null)。

如果要将异构值放入映射中,则值类型必须是类型的公共超类。

Map<String, Object> mapForBoth = ...
mapForBoth.put("key1", "string");
mapForBoth.put("key2", 1);

(实际上,SerializableStringInteger更具体的常见超类;由您决定是否为更好的值类型

答案 1 :(得分:0)

试试这个

 HashMap<String,Object> map =new HashMap<>();
 map.put("sss", "str");
 map.put("sss", 1);