Die allgemeinen Fragen sind:
object::aMethod
in einen Typ wie MethodHandle
als funktionale Schnittstelle konvertiert werden? Stellen Sie sich als Beispiel vor, wir hätten gerne ein MethodRefRunner
als:
Und es kann wie folgt verwendet werden: MethodRefRunner.execute(o, o::someMethod, someParam)
Im obigen Snippet ist eine Option für WHATTYPE
java.util.function.Function
, aber sehr restriktiv. Als diese Antwort erwähnt, war vor der Version b75 ein java.util.function.Block
verfügbar und könnte nützlich sein.
Auf der anderen Seite könnte jede Chance, dass WHATTYPE
irgendwie in ein java.lang.invoke.MethodHandle
umgewandelt werden?
Hinweis für Java-Experten: Bitte verfeinern Sie den Titel der Fragen nach Bedarf.
Ich glaube nicht, dass es irgendeinen Weg gibt, das zu tun, was Sie wollen. WHATTYPE muss eine funktionale Schnittstelle sein - nicht unbedingt Function
, sondern eine, deren einzelne abstrakte Methode mit somemethod
übereinstimmt. Es ist ein gewöhnlicher Schnittstellentyp, der den üblichen Regeln für Java-Typen unterliegt. java.util.function.Block
war ein gewöhnlicher Interface-Typ wie dieser und nicht besonders in der Art, wie du denkst. (Es ist übrigens immer noch bei Consumer
.)
Eine Methodenreferenz funktioniert genau wie ein Lambda und hat wie ein Lambda keinen "Typ" für sich. Sein Typ hängt vom Kontext ab, in dem er verwendet wird. Deine Frage macht also keinen Sinn. Wenn Sie die Methodenreferenz in einem Aufruf dieser MethodRefRunner.execute()
-Methode verwenden, ist der Typ der Methodenreferenz eine Instanz von WHATTYPE
(was auch immer das ist), denn das war die Methode erklärt zu akzeptieren. Wenn Sie es von woanders haben, dann wird dieser Ort wissen, um welchen Typ es sich handelt.