Typiert in einer LambdaMetaFactory

8

Ich erhalte eine Ausnahme, wenn ich metafactory aufruft. Es sagt:

%Vor%

Ich verstehe nicht alles aus der Dokumentation von LambdaMetafactory.metafactory . Ich habe Probleme, die richtigen Parameter herauszufinden:

  • MethodHandles.Lookup Aufrufer - das ist einfach
  • String aufgerufeneName - Ich bin ziemlich sicher hier
  • MethodType aufgerufenerTyp - Was ist das?
  • MethodType samMethodType - Fehler ... hier nicht sicher
  • MethodHandle implMethod - das ist in Ordnung
  • MethodType instanziatedMethodType - Was ist das nochmal? Zum zweiten Mal?

Es läuft also darauf hinaus, was die Unterschiede sind zwischen:

  • MethodType aufgerufenerTyp
  • MethodType samMethodType
  • MethodType instanziatedMethodType

Mein Code ist wie folgt:

%Vor%

mit den Tests

%Vor%     
towi 22.09.2016, 13:33
quelle

1 Antwort

5

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>

zu implementieren
  • 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:

%Vor%     
Holger 22.09.2016, 14:17
quelle