Ich habe eine Frage zu den aufgelösten Arten von Verfahren :: lambdas in Java 8.Warum ist es möglich, eine Methodenreferenz anstelle einer Konverterinstanz zu übergeben?
dieses Beispiel angewandten Methoden, die eine Liste von Objekten wandelt eine gegebene Feder-Core-Converter Implementierung mit:
public static <S, T> List<T> convertToList(Collection<? extends S> input, Converter<S, T> converter) {
List<T> results = new ArrayList<>(input != null ? input.size() : 0);
if (input != null && !input.isEmpty()) {
for (S element : input) {
results.add(converter.convert(element));
}
}
return results;
}
Dann sagen, ich habe eine bestimmte Implementierung, BoatConverter:
public class BoatConverter implements Converter<Boat, BoatConverted> {
@Override
public BoatConverted convert(Boat boat) {
// ...
}
}
eine Möglichkeit, dies zu nennen ist:
ConversionHelper.convertToList(response.getBoats(), boatConverter)
Allerdings stelle ich fest, dass die Java-Compiler (und erwartete Ergebnisse) mit dieser ebenso glücklich sind:
ConversionHelper.convertToList(response.getBoats(), boatConverter::convert)
Bei convert() in diesem Fall gibt eine BoatConverted, aber convertToList() ist ein Konverter Typ erwartet , meine Frage ist, wie der Compiler diese offensichtliche Kollision auflöst, zumal Sie ein Lambda von convert() übergeben, aber die convertToList() - Methode diese Methode auf einem erwarteten konvertierten Objekt aufrufen will?
'Converter' ist eine funktionale Schnittstelle. –