List.sort()NoSuchMethodException 1.6 vs 1.8

Ste*_*eve 5 java eclipse list java-6 java-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);
Run Code Online (Sandbox Code Playgroud)

尽管编译为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代码,就像你在没有编译到Java 8时尝试使用Lambda表达式一样抱怨它:

examples.stream().filter(e -> e.active()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

(e - > e.active())成为问题:

1.8来源

我想如果方法只是java 8,并且我被编译为6,那么只能执行java 6代码 - 我实际上依赖于这个"项目特定设置"来确保我不写任何代码与客户端通常拥有的较低版本不兼容,例如我尝试使用lambda表达式时.

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

Sad*_*Ali 2

问题肯定出在 Eclipse 中的设置上,请按照下面提到的步骤操作以避免您遇到的问题。

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

启用项目特定设置(选中)取消选中“使用执行环境的合规性”...选择所需的“编译器合规性级别”

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

如果你想真正使用 1.6 JDK 生成“1.6”兼容的代码,那么安装一个合适的 1.6 JDK 并通过以下方式告诉 eclipse 它的安装位置:

窗口 -> 首选项 -> 安装的 JRE

然后回到你的项目

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

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

验证正确的 JRE 位于项目的构建路径上,保存所有内容,然后享受吧!

参考:如何让 Eclipse 使用不同的 Java 编译器版本?