Вы должны переосмыслить желаемую подпись метода.Цитировать рекомендации :
Следует избегать использования подстановочного знака в качестве возвращаемого типа, поскольку это заставляет программистов использовать код для работы с подстановочными знаками.
Другими словами, наличие подстановочных знаков в возвращаемых типах заставляет вызывающую сторону распространять подстановочные знаки в каждый код, используя возвращаемый результат.
Метод должен выглядеть примерно так:
public static <K, V> Map<K, V> mergeMaps(
Map<? extends K, ? extends V> map1, Map<? extends K, ? extends V> map2,
BinaryOperator<V> mergeFunction) {
Map<K, V> result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
Это позволяетвызывающая программа выбирает произвольные типы ключей и значений при условии совместимости входного аргумента, что всегда имеет место, если типы ключей и значений входных карт совпадают с типами выходных карт или их подтипов.Конечно, эта подпись также позволяет использовать тот случай, когда типы ключей и значений одинаковы, но не требуют этого.
Реализация самой операции слияния тривиальна.
Вы можетееще больше повысить гибкость метода с помощью
public static <K, V> Map<K, V> mergeMaps(
Map<? extends K, ? extends V> map1, Map<? extends K, ? extends V> map2,
BiFunction<? super V, ? super V, ? extends V> mergeFunction) {
Map<K, V> result = new HashMap<>(map1);
map2.forEach((k,v) -> result.merge(k, v, mergeFunction));
return result;
}
, хотя это редко требуется, поскольку в нем нет необходимости при передаче ссылок на методы или лямбда-выражений.Это помогает только при повторном использовании уже существующих BiFunction
экземпляров.