无法推断 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)
));
我正在尝试创建一个 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)
));