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

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

Susan Sarandon
Susan SarandonOriginal
2024-12-15 06:22:11194Durchsuche

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

Compiler-Falle: Comparator.reversed() und Lambda-Ausdrücke

Lambda-Ausdrücke bieten eine prägnante Möglichkeit, das Sortierverhalten anzupassen, aber wenn sie mit verwendet werden Comparator.reversed() tritt ein Kompilierungsfehler auf. Dieser Fehler ist auf die Unfähigkeit des Compilers zurückzuführen, den richtigen Zieltyp für das Lambda abzuleiten.

Den Fehler verstehen

Bedenken Sie den folgenden Beispielcode:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error

In diesem Fall tritt der Fehler auf, weil der Compiler den Typ des Parameters u im Lambda-Ausdruck nicht bestimmen kann. Um den Typ abzuleiten, benötigt der Compiler einen Zieltyp für das Lambda.

Normalerweise wird der Zieltyp durch den Kontext festgelegt, in dem das Lambda verwendet wird. In der ersten Zeile des von Ihnen bereitgestellten Codeausschnitts ist der Zieltyp Comparator, da userList.sort() ein Argument dieses Typs erwartet. Daraus lässt sich schließen, dass Sie vom Typ „Benutzer“ sind, sodass der Code kompiliert werden kann.

Lambda vs. Methodenreferenz

Der Fehler tritt nur auf, wenn ein Lambda-Ausdruck verwendet wird. Bei Verwendung einer Methodenreferenz (wie in der zweiten Zeile Ihres Codeausschnitts) wird der Zieltyp explizit durch die Methodensignatur bereitgestellt, wodurch das Problem der Typinferenz behoben wird.

Fehlerbehebung

Um den Fehler bei der Verwendung eines Lambda-Ausdrucks zu beheben, können Sie den Parametertyp explizit angeben:

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

Damit wird u explizit angegeben vom Typ „Benutzer“, sodass der Compiler den Zieltyp korrekt ableiten kann.

Compiler-Schwäche

Der fragliche Fehler weist auf eine Schwäche im Typ-Inferenzmechanismus des Compilers hin. Der genaue Grund, warum die Methode reversed() die Zieleingabe stört, ist unklar. Zukünftige Compiler-Verbesserungen könnten dieses Problem beheben und die Verwendung von Lambda-Ausdrücken ohne explizite Parametertypisierung ermöglichen.

Das obige ist der detaillierte Inhalt vonWarum verursacht „Comparator.reversed()' Kompilierungsfehler mit Java-Lambda-Ausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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