Konvertiere MethodHandle in Methodenreferenz (hier Funktion)

8
%Vor%

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%     
Sormuras 11.12.2014, 07:40
quelle

3 Antworten

12

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

%Vor%

Aber das ist nur der Vollständigkeit halber, für den Typ Integer sollten Sie den Konstruktor nicht aufrufen, sondern vorzugsweise valueOf method verwenden.

    
Holger 11.12.2014, 10:15
quelle
5

Ich denke, du brauchst etwas wie:

%Vor%

( Üblicher Haftungsausschluss: Nicht einmal kompiliert. Kompiliert es. Scheint zu funktionieren.)

    
Tom Hawtin - tackline 11.12.2014 09:47
quelle
1

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%     
Sormuras 11.12.2014 10:29
quelle