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

我的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 ?

最佳答案

使用未知的通配符(<?>),可以安全地做出的唯一假设是实例是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;
}

关于java - 将两个通配符哈希图合并为一个通配符哈希图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53913423/

10-12 19:13