Ich erhalte eine Ausnahme, wenn ich metafactory
aufruft. Es sagt:
Ich verstehe nicht alles aus der Dokumentation von LambdaMetafactory.metafactory
. Ich habe Probleme, die richtigen Parameter herauszufinden:
Es läuft also darauf hinaus, was die Unterschiede sind zwischen:
Mein Code ist wie folgt:
%Vor%mit den Tests
%Vor% Die ersten drei Parameter sind nicht speziell für Lambda-Ausdrücke, sondern Standardargumente für Bootstrap-Methoden von invokedynamic
Anweisung. Der Parameter lookup
kapselt den Kontext des Aufrufers, die Parameter invokedName
und invokedType
stellen den Namen und den Typ der Anweisung invokedynamic
dar.
Es liegt an der Bootstrap-Methode, mehr semantische Dinge zu tun. Da in diesem Kontext der Zweck dieser Anweisung darin besteht, eine Lambda-Ausdrucksinstanz zu erzeugen, werden erfasste Werte konsumiert und eine interface
-Instanz erzeugt. Das invokedType
wird also über Parametertypen verfügen, die den Typ der erfassten Werte widerspiegeln oder für nicht erfassbare Lambdas parameterlos sind und einen Rückgabetyp aufweisen, der der gewünschten funktionalen Schnittstelle entspricht. Der invokedName
wird verwendet, um den Methodennamen der funktionalen Schnittstelle anzugeben, was ungewöhnlich ist, da er hier nicht aufgerufen wird, aber da der aufgerufene Name ansonsten keine andere Bedeutung hat, wird dieser Parameter hier wiederverwendet.
Die samMethodType
ist die Signatur der zu implementierenden Methode der funktionalen Schnittstelle (auf der Byte-Code-Ebene), die mit instantiatedMethodType
identisch ist, solange wie z. Generics ist nicht beteiligt. Andernfalls wird samMethodType
dem Typ löschen unterzogen, während instantiatedMethodType
die tatsächlichen Typargumente enthält, z. um ein Function<String,Integer>
invokedType
hat einen Rückgabetyp von Function
samMethodType
wird (Object)Object
sein
instantiatedMethodType
wird (String)Integer
sein
Beachten Sie, dass die Typen in Ihrem speziellen Fall grundsätzlich korrekt sind. Da Sie jedoch die Zielmethode für die angegebene process
-Instanz aufrufen möchten, müssen Sie sie an die Lambda-Instanz binden (Sie haben es nicht einmal versucht). . Leider hast du nicht klar gemacht, was für ein Problem du hast (d. H. Dass du LambdaConversionException
bekommst) in deiner Frage, also habe ich das Problem vorher nicht bemerkt.
Wie oben erwähnt, muss invokedType
die Typen der Werte enthalten, die als Parametertypen erfasst werden sollen. Dann müssen Sie die tatsächliche Instanz process
an den Aufruf invoke
übergeben. Wie der Name schon sagt, muss invokedType
mit dem Typ von invoke
übereinstimmen:
Tags und Links java java-8 lambda reflection method-reference