Comparator.reversed() Inkompatibilität mit Lambda-Ausdrücken
Beim Versuch, eine Liste mithilfe von Lambda-Ausdrücken und der reversed()-Methode von Comparator zu sortieren , kommt es zu einem Kompilierungsfehler. Um dieses Verhalten zu verstehen, ist es wichtig, sich mit den Feinheiten des Typinferenzmechanismus des Compilers zu befassen.
Der Java-Compiler bestimmt den Typ von Variablen in Lambda-Ausdrücken basierend auf dem Kontext, in dem sie verwendet werden. In diesem Fall erwartet die Sortiermethode ein Argument vom Typ Comparator
userList.sort(Comparator.comparing(User::getName).reversed()); // works
Bei der direkten Verwendung von Lambda-Ausdrücken hat der Compiler jedoch Schwierigkeiten, den Typ der Variablen innerhalb des Lambda abzuleiten. Der Zieltyp für das Lambda ist Comparator
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works
Wenn jedoch keine Methodenreferenzen vorhanden sind, leitet der Compiler standardmäßig den Typ von u als Objekt ab, was zu dem Kompilierungsfehler führt:
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Um dieses Problem zu beheben, kann man nach Möglichkeit entweder Methodenreferenzen verwenden oder den Parametertyp innerhalb des Lambda explizit angeben Ausdruck:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); // works
Obwohl diese Einschränkung frustrierend sein kann, ist sie eine Folge des Typinferenzmechanismus des Compilers. Zukünftige Compiler-Verbesserungen könnten dieses Problem beheben.
Das obige ist der detaillierte Inhalt vonWarum verursacht „Comparator.reversed()' Kompilierungsfehler bei einigen Lambda-Ausdrücken in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!