MethodHandle.AsVarargsCollector(Class) メソッド

定義

任意の <数の後続の位置引数を受け入れて配列引数に収集できる em>変数 arity</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>変数 arity</em> アダプターを作成します。

アダプターの型と動作は、ターゲットの型と動作と同じですが、特定 invoke の 要求と asType 要求によって、ターゲットの末尾のパラメーターに末尾の位置引数が収集される可能性があります。 また、ターゲットの最後のパラメーターの種類が異なる場合でも、アダプターの MethodType#lastParameterType の最後のパラメーター型は になります arrayType

この変換は、メソッド ハンドルが既に変数のアリティで、その末尾のパラメーター型が と同じ場合に arrayTypeを返すthis場合があります。

#invokeExact invokeExact呼び出されると、アダプターは引数を変更してターゲットを呼び出します。 (<em>Note:</em> この動作は、固定のアリティ コレクター #asCollector とは異なります。これは、固定数の引数ではなく、不確定な長さの配列全体を受け取るのでです)。

呼び出し元の型がアダプターと同じ場合、プレーンで不正確な #invoke invokeを使用して呼び出されると、アダプターは と同様 invokeExactにターゲットを呼び出します。 (型が一致する場合の通常の invoke 動作です)。

それ以外の場合、呼び出し元とアダプターのアリティが同じであり、呼び出し元の末尾のパラメーター型が、アダプターの末尾のパラメーター型と同じまたは代入可能な参照型である場合、引数と戻り値は、固定の arity メソッド ハンドルの 場合 #asType asType と同様にペアで変換されます。

それ以外の場合は、アリが異なるか、アダプターの末尾のパラメーター型が、対応する呼び出し元の型から割り当てられません。 この場合、アダプターは、元の末尾の引数位置以降のすべての末尾の引数を、 型 arrayTypeの新しい配列に置き換えます。この配列の要素は、置換された引数を (順番に) 構成します。

呼び出し元の型は、末尾の配列引数の前に位置引数のターゲットの要件を満たすために、最小限の引数と正しい型を提供する必要があります。 したがって、呼び出し元は、少なくとも N-1 引数を指定する必要があります。ここで N 、 はターゲットのアリティです。 また、受信引数からターゲットの引数への変換が存在する必要があります。 プレーン invokeの他の用途と同様に、これらの基本的な要件が満たされない場合は、 WrongMethodTypeException がスローされる可能性があります。

いずれの場合も、ターゲットが最終的に返す内容は、アダプターによって変更されずに返されます。

最後のケースでは、ターゲット メソッド ハンドルが、呼び出し元の型に必要なアリティに対して #asCollector 固定アリティ コレクターで一時的に適合されたかのように見えます。 (と同様にasCollector、配列の長さが 0 の場合は、新しい配列の代わりに共有定数を使用できます。の暗黙的な呼び出しasCollectorで または WrongMethodTypeExceptionがスローIllegalArgumentExceptionされる場合、変数アリティ アダプターの呼び出しは をスローWrongMethodTypeExceptionする必要があります)。

#asType asType 動作は、変数アリティ アダプターにも特化されており、プレーンなインバリアントを維持するために、inexact invoke は常にターゲットの型を asType 調整する呼び出しに相当し、その後に が続 invokeExactきます。 したがって、可変アリティ アダプターは、アダプターと要求された型がアリティまたは末尾の引数の型で異なる場合にのみ、固定アリティ コレクターを構築することによって要求に応答 asType します。 結果として得られる固定アリティ コレクターの型は、 の別のアプリケーション asTypeのように、ペアごとの変換によって要求された型に (必要に応じて) さらに調整されます。

定数の命令をldc実行してメソッド ハンドルを取得し、ターゲット メソッドが変数 arity メソッドとしてマークされている場合 (修飾子ビット0x0080を使用)、メソッド ハンドルは、メソッド ハンドル定数が への呼び出しによって作成されたかのように、複数のアリティをasVarargsCollector受け入CONSTANT_MethodHandleれます。

所定の数の引数を収集し、その型にこの事前に定義された数が反映される収集アダプターを作成するには、代わりに を使用 #asCollector asCollector します。

メソッド ハンドル変換では、変数のアリティを持つ新しいメソッド ハンドルが生成されません。ただし、そのように文書化されていない限りです。 したがって、 および withVarargsに加えてasVarargsCollector、 のすべてのメソッドMethodHandleMethodHandlesは、元のオペランド (メソッド ハンドルの独自の型のなど) を返すように指定されている場合を除き、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><p style="font-size:smaller;"><em>Discussion:</em> これらのルールは、可変アリティ メソッドの Java 規則の動的に型指定されたバリエーションとして設計されています。 どちらの場合も、変数アリティ メソッドまたはメソッド ハンドルの呼び出し元は、0 個以上の位置引数を渡すか、または任意の長さの事前に収集された配列を渡すことができます。 ユーザーは、最終的な引数の特殊な役割と、その最終引数に対する型の一致の影響を認識する必要があります。これにより、1 つの末尾の引数が配列全体として解釈されるか、収集される配列の単一の要素として解釈されるかが決まります。 末尾の引数の動的型は、この決定には影響を与えず、呼び出しサイトのシンボリック型記述子とメソッド ハンドルの型記述子の比較のみであることに注意してください)。

java.lang.invoke.MethodHandle.asVarargsCollector(java.lang.Class<?>)Java ドキュメント。

このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。

適用対象