Langage

MethodHandle.AsType(MethodType) Méthode

Définition

Produit un handle de méthode d’adaptateur qui adapte le type du handle de méthode actuel à un nouveau type.

[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

Paramètres

newType
MethodType

type attendu du nouveau handle de méthode

Retours

un handle de méthode vers lequel les délégués this après avoir effectué toutes les conversions d’arguments nécessaires et organise les conversions de valeur de retour nécessaires

Attributs

Remarques

Produit un handle de méthode d’adaptateur qui adapte le type du handle de méthode actuel à un nouveau type. Le handle de méthode résultant est garanti pour signaler un type qui est égal au nouveau type souhaité.

Si le type d’origine et le nouveau type sont égaux, retourne this.

Le nouveau handle de méthode, lorsqu’il est appelé, effectue les étapes suivantes : <ul><li>Convert the incoming argument list to match the original method handle’s argument list. <li>Invoke the original method handle on the converted argument list. <li>Convert any result return by the original method handle to the return type of new method handle. </ul>

Cette méthode fournit la différence comportementale cruciale entre #invokeExact invokeExact et brut, incorrect #invoke invoke. Les deux méthodes effectuent les mêmes étapes lorsque le descripteur de type de l’appelant effectue exactement le mches de l’appelé, mais lorsque les types diffèrent, les appels asType simples #invoke invoke (ou un équivalent interne) afin de faire correspondre les types de l’appelant et de l’appelé.

Si la méthode actuelle est une conversion de liste d’arguments de gestion d’arité variable peut impliquer la conversion et la collection de plusieurs arguments dans un tableau, comme #asVarargsCollector décrit ailleurs. Dans tous les autres cas, toutes les conversions sont appliquées <par paire< em>/em>, ce qui signifie que chaque argument ou valeur de retour est converti en exactement un argument ou une valeur de retour (ou aucune valeur de retour). Les conversions appliquées sont définies en consultant les types de composants correspondants de l’ancien et nouveau type de handle de méthode.

Laissez <em>T0</em> et <em>T1</em> correspondre aux nouveaux et anciens types de paramètres, ou anciens et nouveaux types de retour. Plus précisément, pour un index ivalide, laissez <em>T0</em>=newType.parameterType(i) et <em>T1</em>=this.type().parameterType(i). Sinon, aller de l’autre façon pour les valeurs de retour, laissez em T0</em>=this.type().returnType() et <em>T1</em=newType.returnType()>.>< Si les types sont identiques, le nouveau handle de méthode n’apporte aucune modification à l’argument ou à la valeur de retour correspondant (le cas échéant). Sinon, l’une des conversions suivantes est appliquée si possible : <ul><li>If <em>T0</em> et <em>T1</em> sont des références, un cast en <em>T1</em> est appliqué. (Les types n’ont pas besoin d’être liés d’une manière particulière. Cela est dû au fait qu’une valeur dynamique de Null peut être convertie en n’importe quel type de référence.) <li>Si <em>T0</em> et <em>T1</em> sont des primitives, une conversion d’appel de méthode Java (JLS 5.3) est appliquée, le cas échéant. (Plus précisément, <em T0</em> doit se convertir en <em>T1</em> par une conversion primitive étendue.) <>li>If <em>T0</em> est une référence primitive et <em>T1</em>, une conversion de cast Java (JLS 5.5) est appliquée s’il en existe un. (Plus précisément, la valeur est boxée d’em <>T0</em> à sa classe wrapper, qui est ensuite étendue selon les besoins pour <em>T1</em>.) <li>If <em>T0</em> est une référence et <em>T1</em> a primitive, une conversion d’unboxing est appliquée au moment de l’exécution, éventuellement suivie d’une conversion d’appel de méthode Java (JLS 5.3) sur la valeur primitive. (Il s’agit des conversions d’élargissement primitives.) <em>T0</em> doit être une classe wrapper ou un supertype d’un. (Dans le cas où <em>T0</em> est Object, il s’agit des conversions autorisées par java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke.) La conversion d’unboxing doit avoir une possibilité de réussite, ce qui signifie que si em T0</em> n’est pas lui-même une classe wrapper, il doit exister au moins une classe <wrapper em>TW</em> qui est un sous-type d’em>< T0</em> et dont la valeur primitive nonboxée peut être étendue à <em>T1</em>.>< <li>Si le type <de retour em>T1</em> est marqué comme void, toute valeur retournée est ignorée <li>Si le type <de retour em>T0</em> est void et <em>T1</em> une référence, une valeur null est introduite. <li>Si le type <de retour em>T0</em> est void et <em>T1</em> a primitive, une valeur zéro est introduite. </ul> (<em>Remarque :</>em Les deux>< em T0</em et <em>T1</em>> peuvent être considérés comme des types statiques, car aucun des deux correspond spécifiquement au <type< dynamique em>/em> d’un argument réel ou d’une valeur de retour.)

La conversion de handle de méthode ne peut pas être effectuée si l’une des conversions par paire requises ne peut pas être effectuée.

Lors de l’exécution, les conversions appliquées aux arguments de référence ou aux valeurs de retour peuvent nécessiter des vérifications d’exécution supplémentaires qui peuvent échouer. Une opération d’annulation de boîte de réception peut échouer, car la référence d’origine est null, ce qui provoque un java.lang.NullPointerException NullPointerException. Une opération d’annulation de boîte de réception ou un cast de référence peut également échouer sur une référence à un objet du type incorrect, provoquant un java.lang.ClassCastException ClassCastException. Bien qu’une opération de déboxing puisse accepter plusieurs types de wrappers, si aucune n’est disponible, une ClassCastException opération sera levée.

Java documentation pour java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).

Les parties de cette page sont des modifications basées sur le travail créé et partagé par Android Open Source et utilisées en fonction des termes décrits dans la Creative Commons 2.5 Attribution License.

S’applique à