List.sort() NoSuchMethodException 1.6 与 1.8

List.sort() NoSuchMethodException 1.6 vs 1.8

所以我对 Java 8 中的更改有点困惑 - List.sort - 请耐心等待,因为这种困惑会变得很明显。

我安装了 Java 8 JDK 并且 运行 Eclipse 中有问题的项目设置为在 1.6(Windows 环境)中编译。

我一直在做的整个代码(示例扩展了 BaseExample):

public static final Comparator<BaseExample> sortByLevel_DESC = new Comparator<NavItemBase>() {...};

List<Example> examples = new ArrayList<Example>();

examples.sort(sortByLevel_DESC);

尽管编译为 1.6,这仍然有效,并且一直对我有效(记住我已经安装了 Java 8)。

然而...

由于将此代码应用于客户端机器 - 安装了 Java 7(JRE 不是 JDK)(Linux 环境),抛出异常 "java.util.List.sort() NoSuchMethodException"。

将代码从:examples.sort(sortByLevel_DESC); 更改为:Collections.sort(examples, sortByLevel_DESC); 可解决问题。

这使我得出一个明显的结论,即由于 Java 8 特定代码,并且由于 Java 8 未安装,它失败了。

但我还在想...

为什么 eclipse 在未编译为 Java 8 时不抱怨 Java 8 代码,如果您尝试使用 Lambda 表达式但未编译为 [=54],它会以完全相同的方式抱怨=] 8:

examples.stream().filter(e -> e.active()).collect(Collectors.toList());

(e -> e.active()) 是问题所在:

我还以为如果方法只有java8,而我被编译成6,那么只能执行java6代码——我居然靠在这个 "project specific setting" 上,以确保我不会编写任何与客户通常拥有的较低版本不兼容的代码,例如当我尝试 lambda 表达式时。

也许这实际上是 Eclipse 的问题而不是 Java?或者这可能与 lambda 表达式完全不同(以它应该显示错误的方式)?

在计算 class 或接口具有哪些方法时,Eclipse 只使用您在 [=21] 中为项目指定的任何 JRE(或 JDK)中的运行时 jar =] 构建路径。

因此,要检查您的代码是否使用 Java 6 编译,您需要在 'Java > Installed JREs' 的首选项中告诉 Eclipse 关于 Java 6 JRE。然后,您将该 JRE 用于项目(在项目属性 'Java Build Path' 的 'Library' 选项卡中)。

请注意,将执行环境更改为 Java 1.6 是不够的,除非您安装了 'perfect match' JRE/JDK。

肯定是eclipse设置的问题,请按照下面的步骤来避免你遇到的问题。

从菜单栏:项目 -> 属性 -> Java 编译器

启用项目特定设置(选中)取消选中"use Compliance from execution environment '.... Select the desired "编译器合规级别

这将允许您使用“1.8”编译“1.6”代码JDK。

如果您想实际使用 1.6 JDK 来生成“1.6”兼容代码,请安装合适的 1.6 JDK 并通过以下方式告诉 eclipse 安装位置:

Window -> 首选项 -> 安装的 JRE

然后返回您的项目

项目 -> 属性 -> Java 构建路径 -> 库

删除 1.8 系统库,并:添加库... -> JRE 系统库 -> 备用 JRE -> 你想要的 JRE。

验证正确的 JRE 在项目的构建路径上,保存所有内容,尽情享受吧!

参考:how do I get eclipse to use a different compiler version for Java?