【问题标题】:Explicit type hint in method reference lambda results in raw type方法引用 lambda 中的显式类型提示导致原始类型
【发布时间】:2020-10-13 16:46:33
【问题描述】:

在某些情况下,使用显式类型的泛型方法引用映射 Optional 似乎会导致类型推断失败。在下面的示例中,第一行编译,而当使用 List::<String>ofList::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 的类型提示是不必要的,但在很多情况下需要它,并且为了帮助编译器,必须对映射进行类型提示,从而导致更加冗长

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 错误地将上述某些行突出显示为编译错误。我将关闭并报告错误。

【问题讨论】:

  • 你能展示这种需要类型提示的情况吗?
  • 您使用的是什么版本的 Java?你所有的代码都为我编译。
  • @VGR 你是对的。我使用的是 OpenJDK 15,但事实证明是 Intellij 突出了这些问题(使用相同的 JDK),因为命令行可以正常工作。我想我必须关闭问题并向 Jetbrains 报告错误。

标签: java types jvm


【解决方案1】:

这原来是 Intellij 中的一个错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2017-03-05
    • 2019-01-23
    • 2011-08-09
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多