MethodHandle.AsType(MethodType) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Erzeugt ein Adaptermethodenhandle, das den Typ des aktuellen Methodenhandles an einen neuen Typ anpasst.
[Android.Runtime.Register("asType", "(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "GetAsType_Ljava_lang_invoke_MethodType_Handler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsType(Java.Lang.Invoke.MethodType? newType);
[<Android.Runtime.Register("asType", "(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "GetAsType_Ljava_lang_invoke_MethodType_Handler", ApiSince=26)>]
abstract member AsType : Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle
override this.AsType : Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle
Parameter
- newType
- MethodType
der erwartete Typ des neuen Methodenhandles
Gibt zurück
ein Methodenhandle, das this nach der Durchführung aller erforderlichen Argumentkonvertierungen delegiert wird, und ordnet alle erforderlichen Rückgabewertkonvertierungen an.
- Attribute
Hinweise
Erzeugt ein Adaptermethodenhandle, das den Typ des aktuellen Methodenhandles an einen neuen Typ anpasst. Der resultierende Methodenhandle wird garantiert einen Typ melden, der dem gewünschten neuen Typ entspricht.
Wenn der ursprüngliche Typ und der neue Typ gleich sind, wird zurückgegeben this.
Das neue Methodenhandle führt beim Aufrufen die folgenden Schritte aus: <ul><li>Konvertieren der Liste der eingehenden Argumente, um der Argumentliste des ursprünglichen Methodenhandles zu entsprechen. <li>Invoke the original method handle on the converted argument list. <li>Konvertieren Sie alle vom ursprünglichen Methodenhandle zurückgegebenen Ergebnisse in den Rückgabetyp des neuen Methodenhandles. </ul>
Diese Methode bietet den entscheidenden Verhaltensunterschied zwischen #invokeExact invokeExact und einfachem, ungenauem #invoke invokeVerhalten. Die beiden Methoden führen dieselben Schritte aus, wenn der Typdeskriptor des Aufrufers genau die Typen des Angerufenen übergibt, aber wenn sich die Typen unterscheiden, werden auch einfache #invoke invoke Aufrufe (oder einige interne Entsprechung) aufgerufen asType , um die Typen des Anrufers und angerufenen Angerufenen abzugleichen.
Wenn es sich bei der aktuellen Methode um eine Variable arity-Methode handelt, kann die Konvertierung von Argumentlisten die Konvertierung und Auflistung mehrerer Argumente in ein Array umfassen, wie #asVarargsCollector an anderer Stelle beschrieben. In jedem anderen Fall werden alle Konvertierungen em>pairwise</em> angewendet<, was bedeutet, dass jedes Argument oder Rückgabewert in genau ein Argument oder rückgabewert konvertiert wird (oder kein Rückgabewert). Die angewendeten Konvertierungen werden durch Beratung der entsprechenden Komponententypen der alten und neuen Methodenhandle-Typen definiert.
Lassen Sie <em T0</em und <em>T1</em>> entsprechende neue und alte Parametertypen oder alte und neue>Rückgabetypen sein. Lassen Sie für einige gültige Indexe em T0></em=newType.parameterType(i)> und <em>T1</em>=this.type().parameterType(i).i< Andernfalls können Sie auf andere Weise Werte für Rückgabewerte verwenden, um T0/em>=this.type().returnType() und <em>T1</em=newType.returnType()> zuzulassen<.>< Wenn die Typen identisch sind, ändert sich das neue Methodenhandle nicht an dem entsprechenden Argument oder Rückgabewert (falls vorhanden). Andernfalls wird eine der folgenden Konvertierungen angewendet, wenn möglich: <ul<>li>Wenn <em>T0</em> und <em>T1</em> Bezüge sind, wird eine Umwandlung in <em>T1</em> angewendet. (Die Typen müssen nicht auf eine bestimmte Weise verwandt sein. Dies liegt daran, dass ein dynamischer Wert von NULL in einen beliebigen Bezugstyp konvertiert werden kann.) <li>Wenn <em>T0</em und <em>T1</em>> Grundtypen sind, wird bei Bedarf eine Java Methodenaufrufkonvertierung (JLS 5.3) angewendet. (Insbesondere <muss em T0</em durch eine verbreiternde Grundtypkonvertierung in <em>>T1</em>> konvertiert werden.) <li>Wenn <em>T0</em ein Grundtyp und <em>T1</em>> ein Bezug ist, wird eine Java Umwandlungskonvertierung (JLS 5.5) angewendet, wenn vorhanden. (Insbesondere wird der Wert von <em T0</em> auf seine Wrapperklasse geschachtelt, die dann nach Bedarf <auf em>T1</em> erweitert wird.) <>li>Wenn <em T0</em ein Verweis und <em>>T1</em>> ein Grundtyp ist, wird zur Laufzeit eine Unboxing-Konvertierung angewendet, möglicherweise gefolgt von einer Java Methodenaufrufkonvertierung (JLS 5.3) auf den Grundtypwert. (Dies sind die Grundtypverbreiterungskonvertierungen.) <em>T0</em> muss eine Wrapperklasse oder ein Supertyp eines sein. (In dem Fall, in dem <em T0</em> -Objekt ist, sind dies die Konvertierungen, die von java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke.)> Die Unboxing-Konvertierung muss eine Erfolgsmöglichkeit haben, was bedeutet, dass, wenn em T0</em> nicht selbst eine Wrapperklasse ist, mindestens eine Wrapperklasse <em TW</em vorhanden sein muss, die ein Untertyp von <em>>T0</em> ist und deren unboxed primitiven Wert auf <em>T1</em>> erweitert werden kann.><
<li>Wenn der Rückgabetyp <em>T1</em> als "void" markiert ist, wird jeder zurückgegebene Wert verworfen <li>Wenn der Rückgabetyp <em>T0</em void ist und <em>T1</em>> ein Bezug ist, wird ein NULL-Wert eingeführt.
<li>Wenn der Rückgabetyp em>T0</em> "void" und <"em>T1</em>" ein Grundtyp <ist, wird ein Nullwert eingeführt.
</ul> (<em Hinweis:</em Sowohl <em>>T0</em> als <auch em>T1</em>> kann als statische Typen betrachtet werden, da weder speziell dem <>dynamischen Typ</em> eines tatsächlichen Arguments oder Rückgabewerts entspricht.)
Die Methodenhandlekonvertierung kann nicht vorgenommen werden, wenn eine der erforderlichen paarweise Konvertierungen nicht vorgenommen werden kann.
Zur Laufzeit erfordern die Konvertierungen, die auf Referenzargumente oder Rückgabewerte angewendet werden, möglicherweise zusätzliche Laufzeitüberprüfungen, die fehlschlagen können. Ein Unboxing-Vorgang schlägt möglicherweise fehl, da der ursprüngliche Verweis null ist, was zu einem java.lang.NullPointerException NullPointerExceptionFehler führt. Ein Unboxing-Vorgang oder ein Verweis cast kann auch bei einem Verweis auf ein Objekt des falschen Typs fehlschlagen, was zu einem java.lang.ClassCastException ClassCastExceptionFehler führt. Obwohl ein Unboxing-Vorgang möglicherweise mehrere Arten von Wrappern akzeptiert, wenn keine verfügbar ist, wird eine ClassCastException ausgelöst.
Java Dokumentation für java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.