Comparator.reversed() 與Lambda 表達式不相容
嘗試使用lambda 表達式和Comparator 的returned(returned() 方法對列表進行排序時,出現編譯錯誤。要理解這種行為,深入研究編譯器複雜的類型推斷機制至關重要。
Java 編譯器根據使用變數的上下文來決定 lambda 表達式中變數的類型。在這種情況下,排序方法需要一個 Comparator
userList.sort(Comparator.comparing(User::getName).reversed()); // works
但是,當直接使用 lambda 表達式時,編譯器很難推斷 lambda 中變數的類型。 lambda 的目標類型是 Comparator
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works
但是,在沒有方法引用的情況下,編譯器預設將u 的類型推斷為Object,從而導致編譯錯誤:
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
要解決此問題,可以在可能的情況下使用方法引用,或者在lambda中明確指定參數類型表達式:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); // works
雖然這個限制可能令人沮喪,但它是編譯器類型推斷機制的結果。未來的編譯器增強功能可能會解決此問題。
以上是為什麼 Java 中的某些 Lambda 表達式會出現 Comparator.reversed() 編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!