言語

MethodHandle.AsType(MethodType) メソッド

定義

現在のメソッド ハンドルの型を新しい型に適合させるアダプター メソッド ハンドルを生成します。

[Android.Runtime.Register("asType", "(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "GetAsType_Ljava_lang_invoke_MethodType_Handler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsType(Java.Lang.Invoke.MethodType? newType);
[<Android.Runtime.Register("asType", "(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "GetAsType_Ljava_lang_invoke_MethodType_Handler", ApiSince=26)>]
abstract member AsType : Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle
override this.AsType : Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle

パラメーター

newType
MethodType

新しいメソッド ハンドルの予期される型

返品

必要な引数変換を実行した後に this にデリゲートし、必要な戻り値の変換を配置するメソッドハンドル

属性

注釈

現在のメソッド ハンドルの型を新しい型に適合させるアダプター メソッド ハンドルを生成します。 結果のメソッド ハンドルは、目的の新しい型と等しい型を報告することが保証されます。

元の型と新しい型が等しい場合は、 thisを返します。

新しいメソッド ハンドルが呼び出されると、次の手順が実行されます。 <ul><li>元のメソッド ハンドルの引数リストに一致するように、受信引数リストを変換します。 <li>変換された引数リストの元のメソッド ハンドルを取り込みます。 <li>元のメソッド ハンドルによって返された結果を、新しいメソッド ハンドルの戻り値の型に変換します。 </ul>

この方法は、 #invokeExact invokeExact と単純で不正確な #invoke invokeの間の重要な動作の違いを提供します。 2 つのメソッドは、呼び出し元の型記述子が呼び出し先の型記述子とまったく同じ手順を実行しますが、型が異なる場合は、呼び出し元と呼び出し先の型を一致させるために、プレーン #invoke invokeasType (または内部的に同等のもの) を呼び出します。

現在のメソッドが変数アリティ メソッドの場合、引数リストの変換では、他の場所で説明されているように、複数の引数の配列への変換とコレクション #asVarargsCollector 伴う場合があります。 それ以外の場合は、すべての変換が <em>ペアワイズ</em>に適用されます。つまり、各引数または戻り値は、正確に 1 つの引数または戻り値 (または戻り値なし) に変換されます。 適用される変換は、古いメソッドハンドルと新しいメソッドハンドルタイプの対応するコンポーネントタイプを参照することによって定義されます。

<em>T0</em>と<em>T1</em>対応する新旧の戻り値の型にしてください。 具体的には、有効なインデックス iについては、 <em>T0</em>=newType.parameterType(i) と <em>T1</em>=this.type().parameterType(i) を指定します。 それ以外の場合は、戻り値の場合は、 <em>T0</em>=this.type().returnType() と <em>T1</em>=newType.returnType() にします。 型が同じ場合、新しいメソッド ハンドルは対応する引数または戻り値 (存在する場合) に変更を行いません。 それ以外の場合は、可能であれば、 <ul><li>if <em>T0</em> および <em>T1</em> が参照である場合、 <em>T1</em> へのキャストが適用されます。 (型は特定の方法で関連付ける必要はありません。これは、null の動的値が任意の参照型に変換できるためです)。<li><em>T0</em> および <em>T1</em> がプリミティブの場合は、Java メソッド呼び出し変換 (JLS 5.3) が適用されます (存在する場合)。 (具体的には、<em>T0</em> 拡大プリミティブ変換によって <em>T1</em> に変換する必要があります)。) <li><em>T0</em>がプリミティブで<em>T1</em>参照である場合は、Javaキャスト変換 (JLS 5.5) が適用されます。 (具体的には、値は <em>T0</em> からラッパー クラスにボックス化され、<em>T1</em> に必要に応じて拡大されます)。<li><em>T0</em> が参照であり、プリミティブ <>emT1</em>場合、アンボックス化変換が実行時に適用され、その後にプリミティブ値に対して Java メソッド呼び出し変換 (JLS 5.3) が適用される可能性があります。 (これらはプリミティブ拡大変換です)。 <em>T0</em> はラッパー クラスまたはスーパータイプである必要があります。 ( <em>T0</em> が Object の場合、これらは java.lang.reflect.Method#invoke java.lang.reflect.Method.invokeで許可される変換です)。ボックス化解除変換には成功する可能性が必要です。つまり、 <em>T0</em> 自体がラッパー クラスではない場合、 少なくとも 1 つのラッパー クラス <em>TW</em> が存在する必要があります。これは、 <em>T0</em> のサブタイプであり、ボックス化されていないプリミティブ値を <em>T1</em> に拡大できます。 <li>戻り値 <em>T1</em> が void としてマークされている場合、戻り値は <li>戻り値の型が <em>T0</em> が void であり、 <em>T1</em> 参照が導入された場合は null 値が導入されます。 <li>戻り値の型 <em>T0</em> が void で、プリミティブ <>T1</em>ゼロ値が導入されます。 </ul> (<em>Note:</em><em>T0</em> と <em>T1</em> は静的型と見なすことができます。 これは、実際の引数または戻り値の <em>dynamic 型</em> に特に対応していないためです)。

必要なペアワイズ変換のいずれかを行うことができない場合、メソッド ハンドル変換を行うことはできません。

実行時に、参照引数または戻り値に適用される変換には、失敗する可能性がある追加のランタイム チェックが必要になる場合があります。 元の参照が null であるため、ボックス化解除操作が失敗し、 java.lang.NullPointerException NullPointerExceptionが発生する可能性があります。 ボックス化解除操作または参照キャストも、間違った型のオブジェクトへの参照で失敗し、 java.lang.ClassCastException ClassCastExceptionが発生する可能性があります。 ボックス化解除操作では複数の種類のラッパーを受け入れることがありますが、使用できない場合は、 ClassCastException がスローされます。

Javaドキュメント。

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

適用対象