Methodenreferenz. Kann keine statische Referenz auf die nicht statische Methode erstellen

9

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" ?

%Vor%     
Skip 16.09.2015, 21:32
quelle

2 Antworten

8

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:

%Vor%

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 16.09.2015, 22:31
quelle
1

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

%Vor%

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 .

    
Marco Torchiano 17.09.2015 10:17
quelle

Tags und Links