Я пишу метод, который преобразует коллекцию в отсортированную карту карт, используя два уровня группировки.Код работает правильно, но когда я пытаюсь вытянуть поставщика карт в свой собственный метод, IntelliJ / Java нарушает вывод типа и код не компилируется.
Исходный код:
collection.stream()
.collect(Collectors.groupingBy(
item -> item.getKey(),
() -> new TreeMap<>(keyComparator),
Collectors.groupingBy(
secondItem -> secondItem.getKey(),
() -> new TreeMap<>(secondKeyComparator),
Collectors.toList()
)
);
Рефакторированный код:
collection.stream()
.collect(Collectors.groupingBy(
item -> item.getKey(),
sortedMapBuilder(keyComparator),
Collectors.groupingBy(
secondItem -> secondItem.getKey(),
sortedMapBuilder(secondKeyComparator),
Collectors.toList()
)
);
...
private <K, V> Supplier<TreeMap<K, V>> sortedMapBuilder(Comparator<K> comparator) {
return () -> new TreeMap<>(comparator);
}
Чего мне не хватает, что мешает Java выводить правильные универсальные типы в рефакторированном примере?
Я получаю две разные ошибки в зависимости от того, как я перемещаю код:
Error:(95, 25) java: incompatible types: inference variable R has incompatible bounds
equality constraints: java.util.TreeMap<java.lang.String,java.util.TreeMap<java.lang.String,java.util.List<java.lang.String>>>,M
upper bounds: java.util.Map<java.lang.String,java.util.TreeMap<java.lang.String,java.util.List<java.lang.String>>>,java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.util.List<java.lang.String>>>,java.lang.Object
Error:(109, 37) java: incompatible types: inferred type does not conform to equality constraint(s)
inferred: java.util.TreeMap<java.lang.String,java.util.List<java.lang.String>>
equality constraints(s): java.util.TreeMap<java.lang.String,java.util.List<java.lang.String>>,java.util.Map<java.lang.String,java.util.List<java.lang.String>>