我想将两个带有通配符的哈希图组合成一个仍包含动态值的哈希图。
我的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/