这是我正在处理的代码的最小示例:
编译器的输出是:
我发现可以通过将
我最初在java 8中发现了这个问题,但已经验证它仍然会在java 11编译器中发生。
public class Temp {
enum SomeEnum {}
private static final Map<SomeEnum, String> TEST = new EnumMap<>(
Arrays.stream(SomeEnum.values())
.collect(Collectors.toMap(t -> t, a -> "")));
}
编译器的输出是:
Temp.java:27: error: cannot infer type arguments for EnumMap<>
private static final Map<SomeEnum, String> TEST = new EnumMap<>(Arrays.stream(SomeEnum.values())
^
我发现可以通过将
t -> t
替换为Function.identity()
或(SomeEnum t) -> t
来解决此问题,但我不明白为什么会出现这种情况。是javac的哪个限制导致了这种行为?我最初在java 8中发现了这个问题,但已经验证它仍然会在java 11编译器中发生。
Supplier
,使用以下代码即可实现:new EnumMap<>( Arrays.stream(SomeEnum.values()) .collect(Collectors.toMap(t -> t, a -> "", (x, y) -> x, () -> new EnumMap<>(SomeEnum.class))));
。参考自Holger's answer。 - Naman(SomeEnum t) -> t
)。我会为它提供所需的帮助,一切都会顺利进行。 - Ole V.V.