Condividi tramite


MethodHandle.AsSpreader Metodo

Definizione

Overload

AsSpreader(Class, Int32)

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento matrice finale e distribuisce i relativi elementi come argomenti posizionali.

AsSpreader(Int32, Class, Int32)

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento di matrice in una determinata posizione e distribuisce i relativi elementi come argomenti posizionali al posto della matrice.

AsSpreader(Class, Int32)

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento matrice finale e distribuisce i relativi elementi come argomenti posizionali.

[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

Parametri

arrayType
Class

in genere Object[], il tipo dell'argomento della matrice da cui estrarre gli argomenti di diffusione

arrayLength
Int32

numero di argomenti da distribuire da un argomento di matrice in ingresso

Restituisce

un nuovo handle di metodo che distribuisce l'argomento matrice finale, prima di chiamare l'handle del metodo originale

Attributi

Commenti

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento matrice finale e distribuisce i relativi elementi come argomenti posizionali. Il nuovo handle del metodo si adatta, come destinazione, all'handle del metodo corrente. Il tipo dell'adattatore sarà uguale al tipo della destinazione, ad eccezione del fatto che i parametri finali arrayLength del tipo di destinazione vengono sostituiti da un singolo parametro di matrice di tipo arrayType.

Se il tipo di elemento della matrice è diverso da uno dei tipi di argomento corrispondenti nella destinazione originale, la destinazione originale viene adattata per accettare direttamente gli elementi della matrice, come se fosse una chiamata a #asType asType.

Quando viene chiamato, l'adattatore sostituisce un argomento matrice finale dagli elementi della matrice, ognuno come argomento specifico per la destinazione. L'ordine degli argomenti viene mantenuto. Vengono convertiti in modo pairwise eseguendo il cast e/o il unboxing nei tipi dei parametri finali della destinazione. Viene infine chiamata la destinazione. Il risultato restituito alla fine dalla destinazione viene restituito invariato dall'adattatore.

Prima di chiamare la destinazione, l'adapter verifica che la matrice contenga esattamente elementi sufficienti per fornire un conteggio degli argomenti corretto all'handle del metodo di destinazione. La matrice può anche essere Null quando sono necessari zero elementi.

Quando viene chiamato l'adattatore, viene eseguita una query sulla lunghezza dell'argomento fornito array come se by array.length o arraylength bytecode. Se l'adattatore accetta un argomento matrice finale di lunghezza zero, l'argomento fornito array può essere una matrice di lunghezza zero o null; in caso contrario, l'adapter genererà un'eccezione NullPointerException se la matrice è null e genererà se IllegalArgumentException la matrice non dispone del numero corretto di elementi.

Ecco alcuni semplici esempi di handle di metodi di distribuzione di matrici: <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>

Documentazione java per java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.

Si applica a

AsSpreader(Int32, Class, Int32)

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento di matrice in una determinata posizione e distribuisce i relativi elementi come argomenti posizionali al posto della matrice.

[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

Parametri

spreadArgPos
Int32

posizione (indice in base zero) nell'elenco di argomenti in corrispondenza del quale deve iniziare la distribuzione.

arrayType
Class

in genere Object[], il tipo dell'argomento della matrice da cui estrarre gli argomenti di diffusione

arrayLength
Int32

numero di argomenti da distribuire da un argomento di matrice in ingresso

Restituisce

un nuovo handle di metodo che distribuisce un argomento di matrice in una determinata posizione, prima di chiamare l'handle del metodo originale

Attributi

Commenti

Crea un <handle di metodo em>array-spread</em> , che accetta un argomento di matrice in una determinata posizione e distribuisce i relativi elementi come argomenti posizionali al posto della matrice. Il nuovo handle del metodo si adatta, come destinazione, all'handle del metodo corrente. Il tipo dell'adattatore sarà uguale al tipo della destinazione, ad eccezione del fatto che i arrayLength parametri del tipo di destinazione, a partire dalla posizione spreadArgPosin base zero , vengono sostituiti da un singolo parametro di matrice di tipo arrayType.

Questo metodo si comporta in modo molto simile #asSpreader(Class, int)a , ma accetta un argomento aggiuntivo spreadArgPos per indicare in quale posizione nell'elenco dei parametri deve essere eseguita la distribuzione.

Aggiunta in 9.

Documentazione java per java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.

Si applica a