Объедините два подстановочных знака в подстановочный знак - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу объединить две хеш-карты с подстановочными знаками в одну хеш-карту, которая по-прежнему содержит динамические значения.

У меня есть SharedPreferences в двух разных местах в моем приложении Android - мне нужно объединить весь набор водну хэш-карту для передачи в функцию.

Я пробовал функции putAll () и слияния, но подстановочные знаки продолжают вызывать проблемы.

В настоящее время у меня есть две функции, которые возвращают значения,но мне действительно нужно объединить их в одну функцию.

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 голосов
/ 24 декабря 2018

С неизвестным подстановочным знаком (<?>) единственное предположение, которое можно с уверенностью сделать, - это то, что экземпляры являются подтипом объекта.

Мы не можем взять объекты неизвестного типа и поместить их в другую коллекциюдругого неизвестного типа, потому что эти два типа могут быть несовместимы.Однако мы можем поместить их в коллекцию <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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...