首頁 >Java >java教程 >為什麼 `Comparator.comparing().reversed()` 會導致 Lambda 出現編譯器錯誤?

為什麼 `Comparator.comparing().reversed()` 會導致 Lambda 出現編譯器錯誤?

Susan Sarandon
Susan Sarandon原創
2024-12-20 17:22:10261瀏覽

Why Does `Comparator.comparing().reversed()` Cause a Compiler Error with Lambdas?

使用 Lambda 理解 Comparator.reversed() 中的編譯器錯誤

嘗試使用 lambda 表達式對 User物件清單進行排序時比較器,如:

List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName()).reversed());

編譯器可能會顯示錯誤指出它無法在 lambda 的 u 變數中找到 getName() 方法。此問題源自於編譯器類型推斷機制的弱點。

要解決此錯誤,我們需要為 lambda 建立目標類型。使用 Comparator.comparing() 進行排序時,lambda 必須採用與清單中的物件類型相同的參數。

在程式碼的第一行中,我們使用方法引用,目標型別從方法參數型別推斷出來,即User。這使得編譯器能夠正確推斷 lambda 中 u 的型別。

但是,在第三行中,我們使用 lambda 表達式而不是方法引用,對 returned() 的呼叫會破壞目標類型推理。編譯器無法將目標類型傳播回接收者,使 u 具有推斷的 Object 類型,該類型沒有 getName() 方法。

要解決此問題,我們可以使用方法引用或在lambda 中明確指定u 的類型,如下所示:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());

這確保編譯器可以推斷lambda 中u 的正確類型,並根據指定成功對清單進行排序比較器。

以上是為什麼 `Comparator.comparing().reversed()` 會導致 Lambda 出現編譯器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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