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?
Hier gibt es zwei Probleme:
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:
Sie können Ihre void
Methode überladen, um beide Signaturen zu haben:
und verwenden Sie dann beide Methodenreferenzen:
%Vor% 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
:
Expose Syntax Sugar-Methode Referenz, sollten Sie sehen, dass
%Vor%ist gleich
%Vor% was Function <Foo, String>
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 :
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
Verweis auf einen Konstruktor (nicht diesen Fall überhaupt)
Tags und Links java java-8 method-reference