Java + Eclipse:未定义方法 computeIfAbsent(String, (<no type> k) -> {})

Java + Eclipse: The method computeIfAbsent(String, (<no type> k) -> {}) is undefined for the type

我正在使用 Eclipse(Mars.1 Release (4.5.1))并遇到以下错误:The method putIfAbsent(String, new PriorityQueue<>()) is undefined for the type Map<String,PriorityQueue<String>>。一切似乎都已正确完成,但仍然出现错误。我可能缺少什么?

Map<String, PriorityQueue<String>> targets = new HashMap<>();

...


for(String[] ticket: tickets) {
    targets.putIfAbsent(ticket[0], new PriorityQueue<>());
}

编辑 做了以下,但仍然得到错误

编辑 2

已添加 Java 8 SE,但仍然出现错误。

编辑 3

Java 7 中没有方法 Map#putIfAbsent(K key, V value),但 Java 8 中有。参见:

在您的特定情况下,确保 Eclipse 下的项目属性(如下所述)设置为 Java 8. 您可以通过以下方式编辑它们:右键单击项目 > 属性:

  • 项目属性 > Java 构建路径
  • 项目属性 > Java Comiler

这是一个可能的解决方案:

如果您的 Java 构建路径针对 Java 7,请按照以下步骤更改它:

  • Select JRE 系统库
  • 单击位于右侧的按钮编辑...
  • 使用以下选项之一
    • 全局:工作区默认 JRE。确保它设置为 Java 8
    • 本地:备用 JRE。选择Java 8.

设置完成后,可以继续查看Java编译器

现在,您应该 运行 您的项目没有问题。


Do I have to do this to each project individually or does it apply to all projects?

您不必为每个项目都这样做。您可以为该工作区的所有项目设置一个。

要为所有项目设置 Java 运行时环境,您可以检查安装了哪些 JRE 并更改默认值。

  • 转到 Eclipse > 首选项...
  • 搜索JRE
  • 检查已安装的 JRE
    • 如果您最近安装的 JRE 没有出现,请使用按钮 添加... 手动添加它们。或者使用按钮 搜索....
    • 自动添加它们
    • Select 你想要的默认 JRE

如截图所示:默认情况下,勾选的JRE会添加到新创建的Java项目的构建路径中。现在所有的应该都可以了项目。

要为特定项目编辑 JRE,您可以。以下是执行此操作的步骤:

  • Select目标项目,右击>属性
  • Select Java 构建路径
  • 编辑JRE 系统库
  • 从中选择您喜欢的 JRE 版本
    • 执行环境
    • 备用 JRE
    • 工作区默认 JRE

仅Java8.

支持

确保选中以下内容:

  1. 转到您的环境变量(开始 -> 在搜索框中键入环境变量)
  2. 确保您的 java_home 有 jdk 1.8.x 版本的 bin,并且它包含在您的路径中。 (参考你也可以看这里:Environment variables for java installation

设置好环境变量后重启你的eclipse。未定义应该消失。

虽然您已经为 Java 8 设置了编译器设置,但您的项目仍然在其构建路径中引用 Java 7 系统库(根据问题中的 las 屏幕截图,编辑 3)。您需要 select 该系统库 (JavaSE-1.7) 并使用 Edit... 按钮来将其更改为 JavaSE-1.8) - 您在 "Edit 2" 更新中添加的那个。

如果您想知道,区别在于编译器如何为您的代码生成 .class 文件(Compiler Compliance 设置)与Java 用于编译的标准库(JRE 系统库)。这两件事是分开的,但通常配置为相互匹配。