Ist es möglich, die letzte Aufgabe zu erledigen? Der umgekehrte Weg funktioniert nicht: Ist es möglich, Methodenreferenz auf MethodHandle zu konvertieren?
Hier ein weiteres und kopierbares Beispiel:
%Vor% «Diese Antwort» enthält ein Codebeispiel, das zeigt, wie eine MethodHandle
in eine funktionale interface
-Implementierung konvertiert wird Mit derselben Funktion verwenden Java 8 die Lambda-Ausdrücke und Methodenverweise.
Es geht darum, LambdaMetafactory.metafactory
mit das Methodenhandle, die gewünschte Schnittstelle und der Name der einzigen abstract
-Methode und die erforderliche Signatur.
Beide, Methodendokumentation und es ist die Dokumentation der Klasse sind sehr detailliert.
Der Beispielcode kann also für Ihre Anfrage wie folgt aussehen:
%Vor% Hier müssen Sie sich um die Signaturtypen kümmern. Der vierte Parameter samMethodType
bezieht sich auf den Methodentyp der Funktionssignatur root interface
, also müssen wir für den Rohtyp Function
Object apply(Object)
implementieren, während instantiatedMethodType
die Methode Integer apply(String)
beschreibt. Deshalb wird die Methode .generic()
am methodType für den vierten Parameter aufgerufen, der (String)Integer
in (Object)Object
konvertiert.
Dies ist noch schwieriger für Konstruktoren, da der Konstruktor mit einem (String)void
type nachgeschlagen wird, während der Funktionstyp mit dem in der static
Methode übereinstimmt. Für eine static
-Methode entspricht die MethodType
der Methode der MethodType
, während für einen Konstruktor ein anderer Typ für die Suche verwendet werden muss:
Aber das ist nur der Vollständigkeit halber, für den Typ Integer
sollten Sie den Konstruktor nicht aufrufen, sondern vorzugsweise valueOf
method verwenden.
Ich denke, du brauchst etwas wie:
%Vor% ( Üblicher Haftungsausschluss: Nicht einmal kompiliert. Kompiliert es. Scheint zu funktionieren.)
Answer-Sammlung
Kein Handle, nur das Lambda:
%Vor%Einfache (nicht generische, nicht exakte) Lösung:
%Vor%LambdaMetafactory von Holger
%Vor%MethodHandleProxies von Tom Hawtin
%Vor%Tags und Links java java-8 lambda reflection invokedynamic