Heim >Java >javaLernprogramm >Warum verursacht „Comparator.comparing().reversed()' einen Compilerfehler bei Lambdas?
Verstehen des Compiler-Fehlers in Comparator.reversed() mit Lambdas
Beim Versuch, eine Liste von Benutzerobjekten mithilfe eines Lambda-Ausdrucks für zu sortieren B.:
List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName()).reversed());
Der Compiler zeigt möglicherweise eine Fehlermeldung an, die besagt, dass er getName() nicht finden kann. Methode in der u-Variablen des Lambda. Dieses Problem ist auf eine Schwachstelle im Typinferenzmechanismus des Compilers zurückzuführen.
Um diesen Fehler zu beheben, müssen wir den Zieltyp für das Lambda festlegen. Beim Sortieren mit Comparator.comparing() muss das Lambda ein Argument vom gleichen Typ wie die Objekte in der Liste annehmen.
In der ersten Zeile des Codes, wo wir eine Methodenreferenz verwenden, den Zieltyp wird aus dem Methodenparametertyp „Benutzer“ abgeleitet. Dadurch kann der Compiler korrekt auf den Typ von u innerhalb des Lambda schließen.
In der dritten Zeile, in der wir jedoch einen Lambda-Ausdruck anstelle einer Methodenreferenz verwenden, stört der Aufruf von reversed() den Zieltyp Schlussfolgerung. Der Compiler kann den Zieltyp nicht zurück an den Empfänger weitergeben, sodass Sie einen abgeleiteten Objekttyp erhalten, der keine getName()-Methode hat.
Um dieses Problem zu lösen, können wir entweder eine Methodenreferenz verwenden oder Geben Sie explizit den Typ von u im Lambda an, etwa so:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Dadurch wird sichergestellt, dass der Compiler den richtigen Typ für u innerhalb des Lambda ableiten und die Liste erfolgreich entsprechend dem angegebenen sortieren kann Komparator.
Das obige ist der detaillierte Inhalt vonWarum verursacht „Comparator.comparing().reversed()' einen Compilerfehler bei Lambdas?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!