所以我对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())是该问题:
我会想如果该方法只是java 8,并且我编译为6,那么只能执行java 6代码 - 我实际上依赖于此“项目特定设置”以确保我不'不要写任何与客户端经常有的低版本不兼容的代码,比如当我尝试lambda表达式时。
也许这实际上是Eclipse而不是Java的问题?或者,这可能与lambda表达式不一样(它应该显示错误)?
你是如何设置Java 6兼容模式?在Eclipse中使用合规性级别? – Tom
“也许这实际上是Eclipse而不是Java的问题”。 Eclipse绝对是一个问题。 IDEA有两个设置:语言级别和JDK。 JDK包含类定义,例如你可以使用(像'List.sort'。语言水平定义了语法构造可以使用的方法。我不知道怎么Eclipse的交易与此有关。 – Michael
@JornVernee我不认为IDE编译的代码在风格匹配语言级别设置(或Eclipse中的“合规性级别”),它只是设置文件格式,就像你说的那样,并检查你是否使用了不在该版本中工作的东西,比如带有@ since注释的方法>当前的版本。 – Tom