MethodHandle.AsVarargsCollector(Class) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
<em>可変のアリティ</em> アダプターを作成します。このアダプターは、任意の数の末尾の位置引数を受け取り、それらを配列引数に収集できます。
[Android.Runtime.Register("asVarargsCollector", "(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", "GetAsVarargsCollector_Ljava_lang_Class_Handler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsVarargsCollector(Java.Lang.Class? arrayType);
[<Android.Runtime.Register("asVarargsCollector", "(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", "GetAsVarargsCollector_Ljava_lang_Class_Handler", ApiSince=26)>]
abstract member AsVarargsCollector : Java.Lang.Class -> Java.Lang.Invoke.MethodHandle
override this.AsVarargsCollector : Java.Lang.Class -> Java.Lang.Invoke.MethodHandle
パラメーター
- arrayType
- Class
多くの場合、 Object[]、引数を収集する配列引数の型
返品
元のメソッド ハンドルを呼び出す前に、任意の数の末尾の引数を配列に収集できる新しいメソッド ハンドル
- 属性
注釈
<em>可変のアリティ</em> アダプターを作成します。このアダプターは、任意の数の末尾の位置引数を受け取り、それらを配列引数に収集できます。
アダプターの型と動作は、ターゲットの型と動作と同じになります。ただし、特定の invoke および asType 要求によって、ターゲットの末尾のパラメーターに後続の位置引数が収集される可能性がある点が異なります。 また、ターゲットに別の最後のパラメーター型がある場合でも、アダプターの MethodType#lastParameterType の最後のパラメーター型は arrayTypeされます。
この変換は、メソッド ハンドルが既に変数のアリティであり、その後続のパラメーター型がarrayTypeと同じ場合、thisを返す可能性があります。
#invokeExact invokeExactで呼び出されると、アダプターは引数を変更せず、ターゲットを呼び出します。 (<em>Note:</em> この動作は、固定の引数ではなく、不確定な長さの配列全体を受け入れるため、#asCollector 固定アリティ コレクターとは異なります)。
プレーンで非アクティブな #invoke invokeで呼び出されると、呼び出し元の種類がアダプターと同じ場合、アダプターは invokeExactと同様にターゲットを呼び出します。 (これは、型が一致する場合の invoke の通常の動作です)。
それ以外の場合、呼び出し元とアダプターのアリティが同じで、呼び出し元の末尾のパラメーター型がアダプターの末尾のパラメーター型と同じまたは割り当て可能な参照型である場合、引数と戻り値は、固定のアリティ メソッド ハンドルで #asType asType かのようにペアに変換されます。
それ以外の場合は、アリが異なるか、アダプターの末尾のパラメーター型が対応する呼び出し元の型から割り当てできません。 この場合、アダプターは、元の末尾の引数位置からのすべての後続の引数を、置換された引数を要素が (順番に) 構成する arrayType型の新しい配列で置き換えます。
呼び出し元の型は、末尾の配列引数の前の位置引数に対するターゲットの要件を満たすために、最小限の引数と正しい型を提供する必要があります。 したがって、呼び出し元は少なくとも N-1 引数を指定する必要があります。ここで、 N はターゲットのアリティです。 また、受信引数からターゲットの引数への変換が存在する必要があります。 プレーン invokeの他の用途と同様に、これらの基本的な要件が満たされていない場合は、 WrongMethodTypeException がスローされる可能性があります。
いずれの場合も、ターゲットが最終的に返す内容は、アダプターによって変更されずに返されます。
最後のケースでは、ターゲット メソッド ハンドルが、呼び出し元の型で必要なアリティに #asCollector 固定アリティ コレクターで一時的に適合されたかのように正確に表示されます。 ( asCollectorと同様に、配列の長さが 0 の場合は、新しい配列の代わりに共有定数を使用できます。暗黙的な asCollector 呼び出しで IllegalArgumentException または WrongMethodTypeExceptionがスローされる場合、変数アリティ アダプターの呼び出しは WrongMethodTypeExceptionをスローする必要があります)。
#asType asTypeの動作は、可変アリティ アダプターにも特化されており、単純で不正確なinvokeは常にターゲットの型を調整するasType呼び出しに相当し、その後にinvokeExact。 したがって、可変アリティ アダプターは、アダプターと要求された型がアリティまたは末尾の引数の型で異なる場合にのみ、固定アリティ コレクターを構築することによって、 asType 要求に応答します。 結果として得られる固定アリティ コレクターの型は、 asTypeの別のアプリケーションの場合と同様に、ペアワイズ変換によって要求された型にさらに調整されます (必要な場合)。
メソッド ハンドルがCONSTANT_MethodHandle定数のldc命令を実行して取得され、ターゲット メソッドが変数アリティ メソッドとしてマークされている場合 (修飾子ビットが0x0080)、メソッド ハンドルは、メソッド ハンドル定数がasVarargsCollectorの呼び出しによって作成されたかのように、複数のアリティを受け入れます。
所定の数の引数を収集し、その型にこの事前に定義された数を反映する収集アダプターを作成するには、代わりに #asCollector asCollector を使用します。
メソッド ハンドル変換では、変数のアリティを持つ新しいメソッド ハンドルは生成されません。ただし、そのように記述されている場合を除きです。 したがって、 asVarargsCollector と withVarargs以外に、 MethodHandle および MethodHandles のすべてのメソッドは、元のオペランド (メソッド ハンドルの独自の型の asType など) を返すように指定されている場合を除き、固定のアリティを持つメソッド ハンドルを返します。
変数のアリティが既にあるメソッド ハンドルに対して asVarargsCollector を呼び出すと、同じ型と動作を持つメソッド ハンドルが生成されます。 元の変数アリティ メソッド ハンドルを返す (または返さない場合もあります)。
リスト作成変数アリティ メソッド ハンドルの例を次に示します。 <blockquote>
{@code
MethodHandle deepToString = publicLookup()
.findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));
MethodHandle ts1 = deepToString.asVarargsCollector(Object[].class);
assertEquals("[won]", (String) ts1.invokeExact( new Object[]{"won"}));
assertEquals("[won]", (String) ts1.invoke( new Object[]{"won"}));
assertEquals("[won]", (String) ts1.invoke( "won" ));
assertEquals("[[won]]", (String) ts1.invoke((Object) new Object[]{"won"}));
// findStatic of Arrays.asList(...) produces a variable arity method handle:
MethodHandle asList = publicLookup()
.findStatic(Arrays.class, "asList", methodType(List.class, Object[].class));
assertEquals(methodType(List.class, Object[].class), asList.type());
assert(asList.isVarargsCollector());
assertEquals("[]", asList.invoke().toString());
assertEquals("[1]", asList.invoke(1).toString());
assertEquals("[two, too]", asList.invoke("two", "too").toString());
String[] argv = { "three", "thee", "tee" };
assertEquals("[three, thee, tee]", asList.invoke(argv).toString());
assertEquals("[three, thee, tee]", asList.invoke((Object[])argv).toString());
List ls = (List) asList.invoke((Object)argv);
assertEquals(1, ls.size());
assertEquals("[three, thee, tee]", Arrays.toString((Object[])ls.get(0)));
}
</blockquote>
<em>Discussion:</em> これらのルールは、可変アリティ メソッドのJava規則の動的に型指定されたバリエーションとして設計されています。 どちらの場合も、変数アリティ メソッドまたはメソッド ハンドルの呼び出し元は、0 個以上の位置引数を渡すか、または任意の長さの事前に収集された配列を渡すことができます。 ユーザーは、最終的な引数の特殊な役割と、その最後の引数に対する型の一致の影響を認識する必要があります。これは、1 つの末尾の引数が配列全体として解釈されるか、または収集される配列の単一の要素として解釈されるかを決定します。 末尾の引数の動的な型は、この決定には影響しません。呼び出しサイトのシンボリック型記述子とメソッド ハンドルの型記述子の比較のみであることに注意してください)。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。