将两个通配符哈希图合并为一个通配符哈希图

时间:2018-12-24 12:23:15

标签: java android hashmap

我想将两个带有通配符的哈希图组合成一个仍包含动态值的哈希图。

我在Android应用程序的两个不同位置都有SharedPreferences-我需要将整个集合组合到单个哈希映射中以传递给函数。

我尝试了putAll()和merge函数,但是通配符仍然会引起问题。

目前,我有两个返回值的函数,但我确实需要将它们组合成一个函数。

private HashMap<String, ?> getAppPrefs() {
   SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
   return (HashMap<String, ?>) prefs.getAll();
}

private HashMap<String, ?> getScorePrefs() {
   SharedPreferences scoreprefs= this.getSharedPreferences("scoreprefs", 0);
   return (HashMap<String, ?>) scoreprefs.getAll();
}

我的预期结果是:

private HashMap<String, ?> getAllPrefs() {
   SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
   HashMap<String, ?> map1 = (HashMap<String, ?>) prefs.getAll();   
   SharedPreferences scoreprefs= this.getSharedPreferences("scoreprefs", 0);
   HashMap<String, ?> map2 = (HashMap<String, ?>) prefs.getAll();
   HashMap<String, ?> map3 = map1.merge(map2);  // <-- Or something else
   return map3;
}

如果我使用合并,则会得到:

error: no suitable method found for merge(HashMap<String,CAP#1>)
  HashMap<String, ?> map3 = map1.merge(map2);
                                ^
method Map.merge(String,CAP#2,BiFunction<? super CAP#2,? super CAP#2,? extends CAP#2>) is not applicable
  (actual and formal argument lists differ in length)
method HashMap.merge(String,CAP#2,BiFunction<? super CAP#2,? super CAP#2,? extends CAP#2>) is not applicable
  (actual and formal argument lists differ in length)
  where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ?

1 个答案:

答案 0 :(得分:2)

使用未知的通配符(<?>),可以安全地做出的唯一假设是实例是Object的子类型。

我们无法获取未知类型的对象并将其放入另一个未知类型的另一个集合中,因为这两种类型可能不兼容。 但是,我们可以将它们放在<Object>的集合中,因为这样做总是很安全的,然后声明该集合是第三个未知类型。

例如,使用您的示例类型:

public static HashMap<String, ?> merge(HashMap<String ,?> map1, HashMap<String, ?> map2) {
    HashMap<String, Object> merged = new HashMap<>();
    merged.putAll(map1);
    merged.putAll(map2);
    return merged;
}