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