簡體   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