MethodHandle.AsType(MethodType) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Produz um identificador de método de adaptador que adapta o tipo do identificador do método atual a um novo tipo.
[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
Parâmetros
- newType
- MethodType
o tipo esperado do novo identificador de método
Retornos
um identificador de método para o qual delega após a this execução de todas as conversões de argumento necessárias e organiza todas as conversões de valor retornado necessárias
- Atributos
Comentários
Produz um identificador de método de adaptador que adapta o tipo do identificador do método atual a um novo tipo. O identificador de método resultante é garantido para relatar um tipo igual ao novo tipo desejado.
Se o tipo original e o novo tipo forem iguais, retornará this.
O novo identificador de método, quando invocado, executará as seguintes etapas: <ul><li>Converter a lista de argumentos de entrada para corresponder à lista de argumentos do identificador de método original. <li>Invocar o identificador de método original na lista de argumentos convertidos. <li>Convert any result returned by the original method handle to the return type of new method handle. </ul>
Esse método fornece a diferença comportamental crucial entre #invokeExact invokeExact e simples, inexact #invoke invoke. Os dois métodos executam as mesmas etapas quando o descritor de tipo do chamador atesta exatamente o do chamador, mas quando os tipos diferem, o simples #invoke invoke também chama asType (ou algum equivalente interno) para corresponder aos tipos do chamador e do chamador.
Se o método atual for um método de arity variável, a conversão da lista de argumentos poderá envolver a conversão e a coleção de vários argumentos em uma matriz, como #asVarargsCollector descrito em outro lugar. Em todos os outros casos, todas as conversões são aplicadas <em>emparelhamento</em>, o que significa que cada argumento ou valor retornado é convertido em exatamente um argumento ou valor retornado (ou nenhum valor retornado). As conversões aplicadas são definidas consultando os tipos de componente correspondentes dos tipos de identificador de método antigos e novos.
Permita que <em>T0</em> e <em>T1</em> sejam tipos de parâmetro novos e antigos correspondentes ou tipos de retorno antigos e novos. Especificamente, para algum índice iválido, permita que <em>T0</em>=newType.parameterType(i) e <em>T1</em>=this.type().parameterType(i). Ou então, indo para o outro lado para valores retornados, deixe em T0</em>=this.type().returnType() e <em>T1</em=newType.returnType()>.>< Se os tipos forem os mesmos, o novo identificador de método não fará nenhuma alteração no argumento correspondente ou no valor retornado (se houver). Caso contrário, uma das seguintes conversões será aplicada, se possível: <ul><li>Se <em>T0</em> e <em>T1</em> forem referências, uma conversão em>< T1</em> será aplicada. (Os tipos não precisam ser relacionados de nenhuma maneira específica. Isso ocorre porque um valor dinâmico de nulo pode ser convertido em qualquer tipo de referência.) <li>Se <em>T0</em> e <em>T1</em> forem primitivos, uma conversão de invocação de método Java (JLS 5.3) será aplicada, se existir. (Especificamente, <em>T0</em> deve converter em <em>T1</em> por uma conversão primitiva em expansão.) <li>Se <em>T0</em> for um primitivo e <em>T1</em> uma referência, uma conversão de conversão de Java (JLS 5.5) será aplicada se existir. (Especificamente, o valor é classificado de <em T0</em> para sua classe wrapper, que é ampliada conforme necessário para <em>T1</em>.) <>li>Se <em>T0</em> for uma referência e <em>T1</em> um primitivo, uma conversão de unboxing será aplicada em runtime, possivelmente seguida por uma conversão de invocação de método Java (JLS 5.3) no valor primitivo. (Estas são as conversões primitivas de ampliação.) <em>T0</em> deve ser uma classe wrapper ou um supertipo de um. (No caso <em que em>T0</em> é Objeto, estas são as conversões permitidas por java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke.) A conversão de unboxing deve ter uma possibilidade de sucesso, o que significa que, se em T0</em> si não for uma classe wrapper, deve haver pelo menos uma classe <wrapper em>TW</em> que seja um subtipo em <>T0</em> e cujo valor primitivo não em caixa pode ser ampliado para <em>T1</em>.><
<li>Se o tipo <de retorno em>T1</em> for marcado como nulo, qualquer valor retornado será descartado <li>Se o tipo <de retorno em>T0</em> for nulo e <em>T1</em> uma referência, um valor nulo será introduzido.
<li>Se o tipo <de retorno em>T0</em> for nulo e <em>T1</em> um primitivo, um valor zero será introduzido.
</ul> (<em>Observação:</em> Ambos <em>T0</em> e <em>T1</em> pode ser considerado como tipos estáticos, pois nenhum deles corresponde especificamente ao <tipo< dinâmico em>> de qualquer argumento real ou valor retornado.)
A conversão do identificador de método não poderá ser feita se nenhuma das conversões pairwise necessárias não puder ser feita.
Em runtime, as conversões aplicadas a argumentos de referência ou valores retornados podem exigir verificações de runtime adicionais que podem falhar. Uma operação de unboxing pode falhar porque a referência original é nula, causando um java.lang.NullPointerException NullPointerException. Uma operação de unboxing ou uma conversão de referência também pode falhar em uma referência a um objeto do tipo errado, causando um java.lang.ClassCastException ClassCastException. Embora uma operação de unboxing possa aceitar vários tipos de wrappers, se nenhum estiver disponível, uma ClassCastException será gerada.
Documentação Java para java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).
Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usadas de acordo com os termos descritos na Licença de Atribuição Creative Commons 2.5.