2017-05-30 88 views
5

所以我对Java 8中的一个变化有点困惑 - List.sort - 承担我的困惑将变得明显。List.sort()NoSuchMethodException 1.6 vs 1.8

我已经安装了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它会抱怨表达式而不是编译成Java 8:

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

(E - > e.active())是该问题:

1.8 source

我会想如果该方法只是java 8,并且我编译为6,那么只能执行java 6代码 - 我实际上依赖于此“项目特定设置”以确保我不'不要写任何与客户端经常有的低版本不兼容的代码,比如当我尝试lambda表达式时。

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

+1

你是如何设置Java 6兼容模式?在Eclipse中使用合规性级别? – Tom

+2

“也许这实际上是Eclipse而不是Java的问题”。 Eclipse绝对是一个问题。 IDEA有两个设置:语言级别和JDK。 JDK包含类定义,例如你可以使用(像'List.sort'。语言水平定义了语法构造可以使用的方法。我不知道怎么Eclipse的交易与此有关。 – Michael

+0

@JornVernee我不认为IDE编译的代码在风格匹配语言级别设置(或Eclipse中的“合规性级别”),它只是设置文件格式,就像你说的那样,并检查你是否使用了不在该版本中工作的东西,比如带有@ since注释的方法>当前的版本。 – Tom

回答

1

这个问题肯定是在eclipse中的设置,请按照下面提到的步骤来避免你面临的问题。

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

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

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

如果你想实际上可以使用1.6 JDK产生“1.6”标准的代码,然后再安装一个合适的1.6 JDK和告诉Eclipse它通过以下方式安装:

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

,然后再回到你的项目

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

取出1.8系统libaries和:添加库... - > JRE系统LIbrary - >备用JRE - >您想要的JRE。

验证正确的JRE是项目的构建路径,保存一切,并享受!

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

+1

我改变的是正确答案,这一个,因为你必须acctualy有1.6 JDK(或JRE) - 以前我是改变项目的库使用的执行环境1.6(例如SDK 1.6(JDK 1.8)) - 自下载Java 6并将JDK添加为“已安装的JRE”(正如Sadiq所建议的)是一种可行的方法。这样做可以让我更改项目特定的lib,并且错误如预期般出现。 – Steve

3

解决某个类或接口有什么方法时,Eclipse只使用您在Java Build Path中为项目指定的任何JRE(或JDK)中的运行时jar。

因此,要检查您的代码是否与Java 6一起编译,您需要在“Java>已安装的JRE”的首选项中告诉Eclipse有关Java 6 JRE的信息。然后使用该JRE作为项目(在项目属性中的'Java Build Path'的'Library'选项卡中)。

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

+0

这是它到底,我总是改变编译器,但我没有记住cha修复构建路径系统库 - 所以这是有用的信息,这要感谢所有提供帮助的人。 – Steve

+0

可能不应该标记为正确answerso匆忙 - 是它真正的我的lib未设置为使用1.6,这样做后然而,Eclipse的仍然是“允许”(不显示任何警告或错误)问题的代码。 – Steve