[英]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())成為問題:
我想如果方法只是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,保存所有內容並享受!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.