Lenguaje

MethodHandle.AsType(MethodType) Método

Definición

Genera un identificador de método de adaptador que adapta el tipo del identificador de método actual a un nuevo tipo.

[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

Parámetros

newType
MethodType

el tipo esperado del nuevo identificador de método

Devoluciones

un identificador de método que delega a this después de realizar las conversiones de argumentos necesarias y organiza las conversiones de valor devuelto necesarias.

Atributos

Comentarios

Genera un identificador de método de adaptador que adapta el tipo del identificador de método actual a un nuevo tipo. Se garantiza que el identificador del método resultante notifique un tipo que sea igual al nuevo tipo deseado.

Si el tipo original y el nuevo tipo son iguales, devuelve this.

El nuevo identificador de método, cuando se invoca, realizará los pasos siguientes: <ul><li>Convierta la lista de argumentos entrantes para que coincida con la lista de argumentos del identificador del método original. <li>Invoque el identificador del método original en la lista de argumentos convertidos. <li>Convert any result returned by the original method handle to the return type of new method handle. </ul>

Este método proporciona la diferencia de comportamiento fundamental entre #invokeExact invokeExact y simple, inexacta #invoke invoke. Los dos métodos realizan los mismos pasos cuando el descriptor de tipo del autor de la llamada exactamente m a pulgadas del destinatario, pero cuando los tipos difieren, las llamadas asType sin formato #invoke invoke (o algún equivalente interno) para que coincidan con los tipos del autor de la llamada y los tipos de destinatario.

Si el método actual es una conversión de lista de argumentos de arity variable puede implicar la conversión y la colección de varios argumentos en una matriz, como #asVarargsCollector se describe en otra parte. En todos los demás casos, todas las conversiones se aplican <en>pares</em>, lo que significa que cada argumento o valor devuelto se convierte en exactamente un argumento o valor devuelto (o ningún valor devuelto). Las conversiones aplicadas se definen consultando los tipos de componentes correspondientes de los tipos de identificador de método antiguos y nuevos.

Deje que <em T0</em> y <em T1</em>> sean los tipos de parámetro nuevos y antiguos correspondientes, o tipos de valor devuelto antiguos>y nuevos. En concreto, para algunos índices iválidos, deje <em>T0</em>=newType.parameterType(i) y <em>T1</em>=this.type().parameterType(i). O bien, vaya al otro camino para los valores devueltos, deje em T0</em>=this.type().returnType() y <em>T1</em=newType.returnType()>.>< Si los tipos son los mismos, el nuevo identificador de método no realiza ningún cambio en el argumento o valor devuelto correspondiente (si existe). De lo contrario, se aplica una de las conversiones siguientes si es posible: <ul<>li>Si <em>T0</em> y <em>T1</em> son referencias, se aplica una conversión a <em>T1</em>. (Los tipos no necesitan estar relacionados de ninguna manera determinada. Esto se debe a que un valor dinámico de NULL puede convertir a cualquier tipo de referencia). <li>Si <em>T0</em> y <em>T1</em> son primitivos, se aplica una conversión de invocación de método Java (JLS 5.3), si existe. (En concreto, <em T0</em> debe convertir a <em>T1</em> mediante una conversión primitiva de ampliación). <>li>Si <em>T0</em> es primitivo y <em>T1</em> una referencia, se aplica una conversión de conversión de Java (JLS 5.5) si existe. (En concreto, el valor se conversión de <em>T0</em> a su clase contenedora, que a continuación se amplía según sea necesario para <em>T1</em>). <li>Si <em>T0</em> es una referencia y <em>T1</em> un primitivo, se aplicará una conversión unboxing en tiempo de ejecución, posiblemente seguido de una conversión de invocación de método Java (JLS 5.3) en el valor primitivo. (Estas son las conversiones de ampliación primitivas). <em>T0</em> debe ser una clase contenedora o un supertipo de uno. (En caso de que <em>T0</em> sea Object, estas son las conversiones permitidas por java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke.) La conversión unboxing debe tener una posibilidad de éxito, lo que significa que si em T0</em> no es en sí misma una clase contenedora, debe existir al menos una clase <contenedora em>TW</em>, que es un subtipo de <em>T0</em> y cuyo valor primitivo noboxado se puede ampliar a <em>T1</em>.>< <li>Si el tipo <de valor devuelto em>T1</em> está marcado como void, cualquier valor devuelto se descarta <li>Si el tipo <de valor devuelto em>T0</em> es void y <em>T1</em> una referencia, se introduce un valor NULL. <li>Si el tipo <de valor devuelto em>T0</em es void y <em>T1</em>> primitivo, se introduce un valor cero. </ul> (<em>Note:</em> Ambos <em>T0</em> y <em>T1</em> pueden considerarse como tipos estáticos, ya que ninguno corresponde específicamente al <tipo< dinámico em>/em> de ningún argumento real o valor devuelto).

No se puede realizar la conversión del identificador de método si no se puede realizar ninguna de las conversiones en pares necesarias.

En tiempo de ejecución, las conversiones aplicadas a argumentos de referencia o valores devueltos pueden requerir comprobaciones adicionales en tiempo de ejecución que pueden producir errores. Se puede producir un error en una operación de unboxing porque la referencia original es null, lo que provoca una java.lang.NullPointerException NullPointerExceptionexcepción . Una operación de unboxing o una conversión de referencia también puede producir un error en una referencia a un objeto del tipo incorrecto, lo que provoca una java.lang.ClassCastException ClassCastExceptionexcepción . Aunque una operación de unboxing puede aceptar varios tipos de contenedores, si no hay ninguno disponible, se producirá una ClassCastException excepción .

Java documentación para java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.

Se aplica a