Heim > Java > javaLernprogramm > Warum verursacht „Comparator.reversed()' Kompilierungsfehler bei einigen Lambda-Ausdrücken in Java?

Warum verursacht „Comparator.reversed()' Kompilierungsfehler bei einigen Lambda-Ausdrücken in Java?

Mary-Kate Olsen
Freigeben: 2024-12-03 14:51:14
Original
375 Leute haben es durchsucht

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

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. Bei Verwendung von Methodenreferenzen ist der Empfängertyp bereits bekannt und das Lambda-Argument wird entsprechend abgeleitet. Zum Beispiel:

userList.sort(Comparator.comparing(User::getName).reversed()); // works
Nach dem Login kopieren

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, der eine Funktion erfordert, die einen Benutzer als Argument akzeptiert. Im folgenden Code leitet das Lambda Sie korrekt als Benutzer ab:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage