首頁 >Java >java教程 >為什麼 Java 中的某些 Lambda 表達式會出現 Comparator.reversed() 編譯錯誤?

為什麼 Java 中的某些 Lambda 表達式會出現 Comparator.reversed() 編譯錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-03 14:51:14376瀏覽

Why Does `Comparator.reversed()` Cause Compilation Errors with Some Lambda Expressions in Java?

Comparator.reversed() 與Lambda 表達式不相容

嘗試使用lambda 表達式和Comparator 的returned(returned() 方法對列表進行排序時,出現編譯錯誤。要理解這種行為,深入研究編譯器複雜的類型推斷機制至關重要。

Java 編譯器根據使用變數的上下文來決定 lambda 表達式中變數的類型。在這種情況下,排序方法需要一個 Comparator 類型的參數。當使用方法引用時,接收者類型是已知的,並且 lambda 參數是相應推斷的。例如:

userList.sort(Comparator.comparing(User::getName).reversed()); // works

但是,當直接使用 lambda 表達式時,編譯器很難推斷 lambda 中變數的類型。 lambda 的目標類型是 Comparator,它需要一個將 User 作為參數的函數。在下面的程式碼中,lambda 正確地將u 推斷為User:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn