List.sort()NoSuchMethodException 1.6 vs 1.8

时间:2017-05-30 15:00:50

标签: java eclipse list java-8 java-6

所以我对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环境),异常&#34; java.util.List.sort()NoSuchMethodException&#34;扔了。

将代码从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());

(e - &gt; e.active())是问题所在:

1.8 source

我原本以为如果方法只是java 8,并且我被编译为6,那么只能执行java 6代码 - 我实际上依赖于这个&#34;项目特定设置&#34;确保我不会编写与客户经常使用的较低版本不兼容的任何代码,例如我尝试使用lambda表达式时。

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

2 个答案:

答案 0 :(得分:3)

在计算类或接口的方法时,Eclipse只使用您在Java Build Path中为项目指定的JRE(或JDK)中的运行时jar。

因此,要检查您的代码是否使用Java 6进行编译,您需要在“Java&gt;”的“首选项”中告知Eclipse有关Java 6 JRE的信息。已安装的JRE'。然后,将该JRE用于项目(在项目属性中的“Java Build Path”的“Library”选项卡中)。

请注意,除非您安装了“完美匹配”JRE / JDK,否则将执行环境更改为Java 1.6是不够的。

答案 1 :(得分:1)

问题肯定在于eclipse中的设置,请按照下面提到的步骤来避免您遇到的问题。

从菜单栏:Project - &gt;属性 - &gt; Java编译器

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

这将允许您编译&#34; 1.6&#34;代码使用&#34; 1.8&#34; JDK。

如果你想实际使用1.6 JDK来生产&#34; 1.6&#34;兼容的代码,然后安装一个合适的1.6 JDK并通过以下方式告诉eclipse安装它:

窗口 - &gt;偏好 - &gt;已安装的JRE

然后回到你的项目

项目 - &gt;属性 - &gt; Java构建路径 - &gt;库

删除1.8系统库,并:添加库... - &gt; JRE系统图书馆 - &gt;替代JRE - &gt;你想要的JRE。

验证项目的构建路径上是否有正确的JRE,保存所有内容并享受!

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