次の方法で共有


MethodHandle.AsSpreader メソッド

定義

オーバーロード

AsSpreader(Class, Int32)

末尾>の配列引数を<受け取り、その要素を<位置引数として分散する em 配列拡散/em> メソッド ハンドルを作成します。

AsSpreader(Int32, Class, Int32)

特定>の<位置で配列引数を受け取り、その要素を<配列の代わりに位置引数として広げる em 配列拡散/em> メソッド ハンドルを作成します。

AsSpreader(Class, Int32)

末尾>の配列引数を<受け取り、その要素を<位置引数として分散する em 配列拡散/em> メソッド ハンドルを作成します。

[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

パラメーター

arrayType
Class

通常 Object[]、拡散引数の抽出元となる配列引数の型

arrayLength
Int32

受信配列引数から拡散する引数の数

戻り値

元のメソッド ハンドルを呼び出す前に、最後の配列引数を分散する新しいメソッド ハンドル

属性

注釈

末尾>の配列引数を<受け取り、その要素を<位置引数として分散する em 配列拡散/em> メソッド ハンドルを作成します。 新しいメソッド ハンドルは、現在のメソッド ハンドルを ターゲットとして適応させます。 アダプターの型はターゲットの型と同じになりますが、ターゲットの型の最終的な arrayLength パラメーターが型の 1 つの配列パラメーター arrayTypeに置き換えられる点が異なります。

配列要素型が元のターゲットの対応する引数型と異なる場合、元のターゲットは、配列要素を直接受け #asType asType取るように調整されます。

呼び出されると、アダプターは末尾の配列引数を配列の要素で置き換えます。それぞれをターゲットに対する独自の引数として置き換えます。 (引数の順序は保持されます)。これらは、ターゲットの末尾のパラメーターの型にキャストまたはボックス化解除することで、ペアに変換されます。 最後に、ターゲットが呼び出されます。 ターゲットから最終的に返されるものは、アダプターによって変更されずに返されます。

ターゲットを呼び出す前に、アダプターは、配列にターゲット メソッド ハンドルに正しい引数数を提供するのに十分な要素が含まれていることを確認します。 (0 個の要素が必要な場合、配列は null になる場合もあります)。

アダプターが呼び出されると、指定されたarray引数の長さが、by または arraylength bytecode のようにarray.length照会されます。 アダプターが長さ 0 の末尾の配列引数を受け入れる場合、指定されたarray引数は長さ 0 の配列にnullすることも、それ以外の場合は配列が正しい数の要素を持たない場合は null a IllegalArgumentException をスローNullPointerExceptionします。

配列拡散メソッド ハンドルの簡単な例を次に示します <。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>

の Java ドキュメントjava.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int)

このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。

適用対象

AsSpreader(Int32, Class, Int32)

特定>の<位置で配列引数を受け取り、その要素を<配列の代わりに位置引数として広げる em 配列拡散/em> メソッド ハンドルを作成します。

[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

パラメーター

spreadArgPos
Int32

スプレッドを開始する引数リスト内の位置 (0 から始まるインデックス)。

arrayType
Class

通常 Object[]、拡散引数の抽出元となる配列引数の型

arrayLength
Int32

受信配列引数から拡散する引数の数

戻り値

元のメソッド ハンドルを呼び出す前に、配列引数を特定の位置に分散する新しいメソッド ハンドル

属性

注釈

特定>の<位置で配列引数を受け取り、その要素を<配列の代わりに位置引数として広げる em 配列拡散/em> メソッド ハンドルを作成します。 新しいメソッド ハンドルは、現在のメソッド ハンドルを ターゲットとして適応させます。 アダプターの型は、ターゲットの型と同じになりますが、0 から始spreadArgPosまる位置から始まるターゲットの型のパラメーターが、型arrayTypeの単一の配列パラメーターに置き換えられる点arrayLengthが異なります。

このメソッドは非常に似た #asSpreader(Class, int)動作をしますが、パラメーター リストのどの位置で拡散が行われるかを示す追加 spreadArgPos の引数を受け入れます。

9 に追加されました。

の Java ドキュメントjava.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int)

このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。

適用対象