无法推断 Collectors.toMap 的类型变量

Cannot Infer Type Variables for Collectors.toMap

我正在尝试创建一个 EnumMap,它只是将枚举的常量映射到它们各自的序数。我想我可以像这样简洁地这样做:

private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
    Arrays.stream(Rank.values()).collect(
        Collectors.toMap(Function::identity, e -> e.ordinal())));

但是,编译器说它无法推断 toMap 的任何类型变量。考虑到 toMap:

的双参数签名,我不明白为什么
public static <T, K ,U> Collector<T, ? ,Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
                                                         Function<? super T, ? extends U> valueMapper)

T应该推断为Rank,因为Arrays.stream(Rank.values())是一个Stream<Rank>K也应该推断为Rank ],因为 Function.identity return 是 Function<T, T>,而 U 应该被推断为 Integer 因为 Enum.ordinal 的 return 类型是 int,在这种情况下应该装箱到 Integer

如有任何帮助,我们将不胜感激。

你想要Function.identity(),而不是Function::identity

private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
    Arrays.stream(Rank.values()).collect(
        Collectors.toMap(Function.identity(), e -> e.ordinal())));

Function::identity 的类型是 Supplier<Function<T,T>>,因为它是一个不带任何参数的方法的方法引用,并且 returns 是 Function<T,T>.

您的键映射函数需要的是 Function<T,T>,只需调用方法 Function.identity().

即可返回

即使@Eran 指出了你的问题,但我认为你需要这段代码,所以在我的回答中写下来:

static Map<Rank, Integer>
defaultRankOrdering = Arrays.stream(Rank.values()).collect(toMap(
        Function.identity(),
        Enum::ordinal,
        (v1, v2) -> v1, // it'is never be used, only support for create an EnumMap
        () -> new EnumMap<>(Rank.class)
));