所以我对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())是问题所在:
我原本以为如果方法只是java 8,并且我被编译为6,那么只能执行java 6代码 - 我实际上依赖于这个&#34;项目特定设置&#34;确保我不会编写与客户经常使用的较低版本不兼容的任何代码,例如我尝试使用lambda表达式时。
也许这实际上是Eclipse的问题,而不是Java?或者这可能与lambda表达式完全不同(它应该显示错误的方式)?
答案 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?