Ошибка вывода несовместимых типов Java при рефакторинге - PullRequest
0 голосов
/ 31 мая 2019

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