繁体   English   中英

List.sort()NoSuchMethodException 1.6 vs 1.8

[英]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来源

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

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

在计算类或接口具有哪些方法时,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是不够的。

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

从菜单栏:Project - > Properties - > Java Compiler

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

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

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

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

然后回到你的项目

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

删除1.8系统库,并:添加库... - > JRE System LIbrary - > Alternate JRE - >你想要的JRE。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM