方法引用lambda中的显式类型提示导致原始类型



在某些情况下,用显式类型的泛型方法引用映射Optional似乎会导致类型推理失败。在下面的例子中,第一行编译,而当给List::of-方法一个带有List::<String>of的显式类型时,它不编译:

Optional.of("one,two").map(List::of).get().get(0).split(",");
// No problem, type inference works fine
Optional.of("one,two").map(List::<String>of).get().get(0).split(",");
// Compiler error, because the mapped Optional becomes typed with a raw List parameter (Optional<List>)

在上面的例子中,List::of的类型提示是不必要的,但在许多情况下需要它,为了帮助编译器,必须键入hint映射,从而导致更详细的

Optional.of("one,two").<List<String>>map(List::of).get().get(0).split(",");

一种情况是,如果我们有像这样的"非此即彼"类型

static class Either<L, R> {
L left;
R right;
private Either(final L left, final R right) {
this.left = left;
this.right = right;
}
static <L, R> Either<L, R> left(final L l) {
return new Either<>(l, null);
}
static <L, R> Either<L, R> right(final R r) {
return new Either<>(null, r);
}
}

然后

final String right =
Optional.of("one,two")
.map(Either::<String, String>left)
.orElse(Either.right("three,four"))
.right;

编译失败,必须进行

final String right =
Optional.of("one,two")
.<Either<String, String>>map(Either::left)
.orElse(Either.right("three,four"))
.right;

为什么会这样?有没有计划改变这一点?

更新:

我使用的是OpenJDK 15,但这似乎是Intellij中的一个问题——从命令行运行javac所有这些编译,但Intellij错误地将上面的一些行突出显示为编译错误。我将关闭并报告一个错误。

这是Intellij中的一个错误。

https://youtrack.jetbrains.com/issue/IDEA-252839

最新更新