编程语言
首页 > 编程语言> > java – List.sort()NoSuchMethodException 1.6 vs 1.8

java – 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); to: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 – > e.active())是问题所在:

1.8 source

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

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

解决方法:

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

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

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

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

如果你想实际使用1.6 JDK生成“1.6”兼容代码,那么安装一个合适的1.6 JDK并告诉eclipse安装它的位置:

窗口 – >偏好 – >已安装的JRE

然后回到你的项目

项目 – >属性 – > Java构建路径 – >图书馆

删除1.8系统库,并:添加库… – > JRE系统图书馆 – >替代JRE – >你想要的JRE.

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

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

标签:java,eclipse,java-8,java-6,list
来源: https://codeday.me/bug/20190522/1154095.html