MethodHandle.AsSpreader メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オーバーロード
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 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。