MethodHandle.AsSpreader Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Sobrecargas
| AsSpreader(Class, Int32) |
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz final y propaga sus elementos como argumentos posicionales. |
| AsSpreader(Int32, Class, Int32) |
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz en una posición determinada y propaga sus elementos como argumentos posicionales en lugar de la matriz. |
AsSpreader(Class, Int32)
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz final y propaga sus elementos como argumentos posicionales.
[Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader(Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)>]
abstract member AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
Parámetros
- arrayType
- Class
normalmente Object[], el tipo del argumento de matriz del que se van a extraer los argumentos de propagación.
- arrayLength
- Int32
el número de argumentos que se van a distribuir desde un argumento de matriz entrante
Devoluciones
un nuevo identificador de método que propaga su argumento de matriz final, antes de llamar al identificador de método original
- Atributos
Comentarios
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz final y propaga sus elementos como argumentos posicionales. El nuevo identificador de método se adapta, como su destino, el identificador del método actual. El tipo del adaptador será el mismo que el tipo del destino, salvo que los parámetros finales arrayLength del tipo del destino se reemplazan por un único parámetro de matriz de tipo arrayType.
Si el tipo de elemento de matriz difiere de cualquiera de los tipos de argumento correspondientes en el destino original, el destino original se adapta para tomar directamente los elementos de la matriz, como si fuera una llamada a #asType asType.
Cuando se llama, el adaptador reemplaza un argumento de matriz final por los elementos de la matriz, cada uno como su propio argumento para el destino. (Se conserva el orden de los argumentos). Se convierten en pares mediante la conversión y/o unboxing en los tipos de los parámetros finales del destino. Por último, se llama al destino. El adaptador devuelve lo que el destino devuelve sin cambios.
Antes de llamar al destino, el adaptador comprueba que la matriz contiene exactamente suficientes elementos para proporcionar un recuento de argumentos correcto al identificador del método de destino. (La matriz también puede ser null cuando se requieren cero elementos).
Cuando se llama al adaptador, se consulta la longitud del argumento proporcionado array como si fuera por array.length o arraylength por código de bytes. Si el adaptador acepta un argumento de matriz final de longitud cero, el argumento proporcionado array puede ser una matriz de longitud cero o null; de lo contrario, el adaptador producirá un NullPointerException si la matriz es null y producirá un IllegalArgumentException si la matriz no tiene el número correcto de elementos.
Estos son algunos ejemplos sencillos de identificadores de método de propagación de matriz: <blockquote>
{@code
MethodHandle equals = publicLookup()
.findVirtual(String.class, "equals", methodType(boolean.class, Object.class));
assert( (boolean) equals.invokeExact("me", (Object)"me"));
assert(!(boolean) equals.invokeExact("me", (Object)"thee"));
// spread both arguments from a 2-array:
MethodHandle eq2 = equals.asSpreader(Object[].class, 2);
assert( (boolean) eq2.invokeExact(new Object[]{ "me", "me" }));
assert(!(boolean) eq2.invokeExact(new Object[]{ "me", "thee" }));
// try to spread from anything but a 2-array:
for (int n = 0; n <= 10; n++) {
Object[] badArityArgs = (n == 2 ? new Object[0] : new Object[n]);
try { assert((boolean) eq2.invokeExact(badArityArgs) && false); }
catch (IllegalArgumentException ex) { } // OK
}
// spread both arguments from a String array:
MethodHandle eq2s = equals.asSpreader(String[].class, 2);
assert( (boolean) eq2s.invokeExact(new String[]{ "me", "me" }));
assert(!(boolean) eq2s.invokeExact(new String[]{ "me", "thee" }));
// spread second arguments from a 1-array:
MethodHandle eq1 = equals.asSpreader(Object[].class, 1);
assert( (boolean) eq1.invokeExact("me", new Object[]{ "me" }));
assert(!(boolean) eq1.invokeExact("me", new Object[]{ "thee" }));
// spread no arguments from a 0-array or null:
MethodHandle eq0 = equals.asSpreader(Object[].class, 0);
assert( (boolean) eq0.invokeExact("me", (Object)"me", new Object[0]));
assert(!(boolean) eq0.invokeExact("me", (Object)"thee", (Object[])null));
// asSpreader and asCollector are approximate inverses:
for (int n = 0; n <= 2; n++) {
for (Class<?> a : new Class<?>[]{Object[].class, String[].class, CharSequence[].class}) {
MethodHandle equals2 = equals.asSpreader(a, n).asCollector(a, n);
assert( (boolean) equals2.invokeWithArguments("me", "me"));
assert(!(boolean) equals2.invokeWithArguments("me", "thee"));
}
}
MethodHandle caToString = publicLookup()
.findStatic(Arrays.class, "toString", methodType(String.class, char[].class));
assertEquals("[A, B, C]", (String) caToString.invokeExact("ABC".toCharArray()));
MethodHandle caString3 = caToString.asCollector(char[].class, 3);
assertEquals("[A, B, C]", (String) caString3.invokeExact('A', 'B', 'C'));
MethodHandle caToString2 = caString3.asSpreader(char[].class, 2);
assertEquals("[A, B, C]", (String) caToString2.invokeExact('A', "BC".toCharArray()));
}
</blockquote>
Documentación de Java para java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int).
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.
Se aplica a
AsSpreader(Int32, Class, Int32)
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz en una posición determinada y propaga sus elementos como argumentos posicionales en lugar de la matriz.
[Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader(int spreadArgPos, Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)>]
abstract member AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
Parámetros
- spreadArgPos
- Int32
la posición (índice de base cero) de la lista de argumentos en la que se debe iniciar la propagación.
- arrayType
- Class
normalmente Object[], el tipo del argumento de matriz del que se van a extraer los argumentos de propagación.
- arrayLength
- Int32
el número de argumentos que se van a distribuir desde un argumento de matriz entrante
Devoluciones
un nuevo identificador de método que propaga un argumento de matriz en una posición determinada, antes de llamar al identificador del método original.
- Atributos
Comentarios
Convierte un <identificador de método em>array-spreading</em> , que acepta un argumento de matriz en una posición determinada y propaga sus elementos como argumentos posicionales en lugar de la matriz. El nuevo identificador de método se adapta, como su destino, el identificador del método actual. El tipo del adaptador será el mismo que el tipo del destino, salvo que los arrayLength parámetros del tipo del destino, a partir de la posición spreadArgPosde base cero, se reemplazan por un único parámetro de matriz de tipo arrayType.
Este método se comporta muy parecido #asSpreader(Class, int)a , pero acepta un argumento adicional spreadArgPos para indicar en qué posición de la lista de parámetros debe tener lugar la propagación.
Agregado en 9.
Documentación de Java para java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int).
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.