重构时Java不兼容的类型推断错误

时间:2019-05-31 19:50:55

标签: java generics

我正在编写一种方法,该方法使用两个级别的分组将集合转换为排序的地图。该代码可以正常工作,但是当我尝试将地图提供程序引入其自己的方法时,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>>

0 个答案:

没有答案