Grenzen von statischen Methodenreferenzen in Java 8

7

Ich versuche, Methodenreferenzen zu verwenden, um Methodenaufrufe zu erfassen und einige Einschränkungen zu treffen. Das funktioniert gut:

%Vor%

Aber wenn ich die Signatur von Foo.setBar in etwa so ändere:

%Vor%

Ich bekomme einen Fehler:

Cannot make a static reference to the non-static method setBar(String) from the type MyTest.Foo

Es ist mir nicht klar, was die Einschränkung ist. Im Idealfall möchte ich Methodenreferenzen verwenden, um Aufrufe auf Standard-Setter zu erfassen. Gibt es eine Möglichkeit, dies zu tun?

    
Josh Stone 21.05.2014, 21:32
quelle

3 Antworten

12

Hier gibt es zwei Probleme:

  • Sie verwenden Function , das etwas zurückgeben muss. setBar gibt nichts zurück.
  • Function nimmt nur eine einzige Eingabe, aber Sie haben zwei Eingaben: das Foo , das Sie setBar nennen würden, und das String Argument, das Sie in% co_de übergeben würden %.

Wenn Sie stattdessen setBar verwenden (was einen BiConsumer Rückgabetyp und zwei Eingaben hat), funktioniert es gut:

%Vor%

Sie können Ihre void Methode überladen, um beide Signaturen zu haben:

%Vor%

und verwenden Sie dann beide Methodenreferenzen:

%Vor%     
Jon Skeet 21.05.2014, 21:38
quelle
8

Foo::getBar entspricht einer Funktion, die ein Foo (das Zielobjekt) und eine String zurückgibt. Die Schnittstelle Function<Foo, String> kann verwendet werden, um eine solche Funktion darzustellen.

Andererseits entspricht Foo::setBar einer Funktion, die zwei Argumente akzeptiert, ein Foo (das Zielobjekt) und ein String (der erste Parameter). Die passende Schnittstelle ist BiConsumer<Foo, String> . Das heißt, Sie benötigen eine Überladung für BiConsumer :

%Vor%     
nosid 21.05.2014 21:39
quelle
3

Expose Syntax Sugar-Methode Referenz, sollten Sie sehen, dass

%Vor%

ist gleich

%Vor%

was Function <Foo, String>

ist

Aber

%Vor%

ist in diesem Zusammenhang die Funktion von zwei Variablen ( foo und einige String str ), also ist es nicht die Funktion einer Variablen ( Function )

Für die bequemere Antwort sollten Sie sehen, wo die Methodenreferenzen erlaubt sind :

  1. Verweis auf eine statische Methode (nicht in diesem Fall)
  2. Verweis auf eine Instanzmethode eines bestimmten Objekts (nicht in diesem Fall)
  3. Verweis auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs (in diesem Fall)

    In der obigen Anleitung gibt es ein Beispiel, das fast genauso ist wie in Ihrem Fall. Und es wird gesagt, dass der äquivalente Lambda-Ausdruck zwei Parameter (in diesem Fall Foo und String ) nehmen würde, was nicht Function

    ist
  4. Verweis auf einen Konstruktor (nicht diesen Fall überhaupt)

Dmitry Ginzburg 21.05.2014 21:37
quelle

Tags und Links