Kann mir jemand erklären,
warum die Übergabe einer nicht statischen Methodenreferenz an die Methode File::isHidden
in Ordnung ist,
aber Methodenreferenz an eine nicht-statische Methode übergeben MyCass::mymethod
- gibt mir eine
"Kann keine statische Referenz auf die nicht statische Methode erstellen" ?
Methodenverweise auf nicht statische Methoden erfordern, dass eine Instanz bearbeitet wird.
Bei der Methode listFiles
ist das Argument FileFilter
mit accept(File file)
. Wenn Sie an einer Instanz (dem Argument) arbeiten, können Sie auf ihre Instanzmethoden verweisen:
ist eine Abkürzung für
%Vor% Nun, warum kannst du test(MyCass::mymethod)
nicht benutzen? Weil Sie einfach keine Instanz von MyCass
zum Ausführen haben.
Sie können jedoch eine Instanz erstellen und dann eine Methodenreferenz an Ihre Instanzmethode übergeben:
%Vor%oder
%Vor% peter-walser hat darauf hingewiesen, da MyCass::mymethod
eine Instanzmethode ist, muss eine Instanz in eine Function
-Instanz konvertiert werden.
Das static
vor Ihrer Interface-Deklaration macht es nur zu einer statischen Schnittstelle , es macht nicht jede Methode zu einer statischen.
Eine mögliche Lösung wäre, die Methode in der Klasse als statisch zu deklarieren:
%Vor% Um besser zu verstehen, wie es funktioniert, können Sie den Code-Äquivalenz mit dem Methodenverweis MyCass::mymethod
betrachten, der (unter der Annahme der obigen modifizierten Deklaration von MyClass
):
Ihr ursprünglicher Code würde versuchen, in folgende Sprachen zu übersetzen:
%Vor% Eine andere Möglichkeit ist die Verwendung einer BiFunction
anstelle von FunctionalInterface
. In diesem Fall wäre das erste Argument von apply
das Objekt und das zweite wäre das Argument für mymethod
.
Tags und Links java-8 method-reference