MethodHandle.AsType(MethodType) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
生成适配器方法句柄,该句柄将当前方法句柄的类型改编为新类型。
[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>Convert the incoming argument list to match the original method handle's argument list. <li>调用转换的参数列表中的原始方法句柄。 <li>将原始方法句柄返回的任何结果转换为新方法句柄的返回类型。 </ul>
此方法提供与普通、不相交#invoke invoke的关键行为差异#invokeExact invokeExact。 当调用方的类型描述符完全与被调用方的类型描述符相同时,这两种方法执行相同的步骤,但当类型不同时,普通 #invoke invoke 调用 asType (或某些内部等效项)才能匹配调用方的类型和被调用方的类型。
如果当前方法是变量 arity 方法句柄参数列表转换,则可能涉及将多个参数的转换和集合转换为数组,如其他位置所述 #asVarargsCollector。 在所有其他情况下,所有转换都应用 <em>pairwise</em>,这意味着每个参数或返回值都转换为完全一个参数或返回值(或无返回值)。 应用转换通过咨询旧方法句柄类型的相应组件类型来定义。
让 <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>如果 <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> 是一个引用和 <em>T1</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> 本身不是包装类,则必须至少有一个包装类 <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 且 <em>T1</em> 为基元,则引入零值。
</ul> (<em>Note:</em> Both <em>T0</em> 和 <em>T1</em> 都可能被视为静态类型,因为两者都未专门对应于 <任何实际参数或返回值的 em>动态类型</em> )。
如果无法进行任何一个必需的成对转换,则无法进行方法句柄转换。
在运行时,应用于引用参数或返回值的转换可能需要额外的运行时检查,这可能会失败。 取消装箱操作可能会失败,因为原始引用为 null,从而导致 。java.lang.NullPointerException NullPointerException 取消装箱操作或引用强制转换也可能对错误类型的对象的引用失败,从而导致 。java.lang.ClassCastException ClassCastException 尽管取消装箱操作可能接受多种包装器,但如果没有可用,将引发一个 ClassCastException 包装器。
Java文档java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType)。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。