List.sort() NoSuchMethodException 1.6 与 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);
更改为:Collections.sort(examples, sortByLevel_DESC);
可解决问题。
这使我得出一个明显的结论,即由于 Java 8 特定代码,并且由于 Java 8 未安装,它失败了。
但我还在想...
为什么 eclipse 在未编译为 Java 8 时不抱怨 Java 8 代码,如果您尝试使用 Lambda 表达式但未编译为 [=54],它会以完全相同的方式抱怨=] 8:
examples.stream().filter(e -> e.active()).collect(Collectors.toList());
(e -> e.active()) 是问题所在:
我还以为如果方法只有java8,而我被编译成6,那么只能执行java6代码——我居然靠在这个 "project specific setting" 上,以确保我不会编写任何与客户通常拥有的较低版本不兼容的代码,例如当我尝试 lambda 表达式时。
也许这实际上是 Eclipse 的问题而不是 Java?或者这可能与 lambda 表达式完全不同(以它应该显示错误的方式)?
在计算 class 或接口具有哪些方法时,Eclipse 只使用您在 [=21] 中为项目指定的任何 JRE(或 JDK)中的运行时 jar =] 构建路径。
因此,要检查您的代码是否使用 Java 6 编译,您需要在 'Java > Installed JREs' 的首选项中告诉 Eclipse 关于 Java 6 JRE。然后,您将该 JRE 用于项目(在项目属性 'Java Build Path' 的 'Library' 选项卡中)。
请注意,将执行环境更改为 Java 1.6 是不够的,除非您安装了 'perfect match' JRE/JDK。
肯定是eclipse设置的问题,请按照下面的步骤来避免你遇到的问题。
从菜单栏:项目 -> 属性 -> Java 编译器
启用项目特定设置(选中)取消选中"use Compliance from execution environment '.... Select the desired "编译器合规级别
这将允许您使用“1.8”编译“1.6”代码JDK。
如果您想实际使用 1.6 JDK 来生成“1.6”兼容代码,请安装合适的 1.6 JDK 并通过以下方式告诉 eclipse 安装位置:
Window -> 首选项 -> 安装的 JRE
然后返回您的项目
项目 -> 属性 -> Java 构建路径 -> 库
删除 1.8 系统库,并:添加库... -> JRE 系统库 -> 备用 JRE -> 你想要的 JRE。
验证正确的 JRE 在项目的构建路径上,保存所有内容,尽情享受吧!
参考:how do I get eclipse to use a different compiler version for Java?
所以我对 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);
更改为:Collections.sort(examples, sortByLevel_DESC);
可解决问题。
这使我得出一个明显的结论,即由于 Java 8 特定代码,并且由于 Java 8 未安装,它失败了。
但我还在想...
为什么 eclipse 在未编译为 Java 8 时不抱怨 Java 8 代码,如果您尝试使用 Lambda 表达式但未编译为 [=54],它会以完全相同的方式抱怨=] 8:
examples.stream().filter(e -> e.active()).collect(Collectors.toList());
(e -> e.active()) 是问题所在:
我还以为如果方法只有java8,而我被编译成6,那么只能执行java6代码——我居然靠在这个 "project specific setting" 上,以确保我不会编写任何与客户通常拥有的较低版本不兼容的代码,例如当我尝试 lambda 表达式时。
也许这实际上是 Eclipse 的问题而不是 Java?或者这可能与 lambda 表达式完全不同(以它应该显示错误的方式)?
在计算 class 或接口具有哪些方法时,Eclipse 只使用您在 [=21] 中为项目指定的任何 JRE(或 JDK)中的运行时 jar =] 构建路径。
因此,要检查您的代码是否使用 Java 6 编译,您需要在 'Java > Installed JREs' 的首选项中告诉 Eclipse 关于 Java 6 JRE。然后,您将该 JRE 用于项目(在项目属性 'Java Build Path' 的 'Library' 选项卡中)。
请注意,将执行环境更改为 Java 1.6 是不够的,除非您安装了 'perfect match' JRE/JDK。
肯定是eclipse设置的问题,请按照下面的步骤来避免你遇到的问题。
从菜单栏:项目 -> 属性 -> Java 编译器
启用项目特定设置(选中)取消选中"use Compliance from execution environment '.... Select the desired "编译器合规级别
这将允许您使用“1.8”编译“1.6”代码JDK。
如果您想实际使用 1.6 JDK 来生成“1.6”兼容代码,请安装合适的 1.6 JDK 并通过以下方式告诉 eclipse 安装位置:
Window -> 首选项 -> 安装的 JRE
然后返回您的项目
项目 -> 属性 -> Java 构建路径 -> 库
删除 1.8 系统库,并:添加库... -> JRE 系统库 -> 备用 JRE -> 你想要的 JRE。
验证正确的 JRE 在项目的构建路径上,保存所有内容,尽情享受吧!
参考:how do I get eclipse to use a different compiler version for Java?