Linguaggio

MethodHandle.AsType(MethodType) Metodo

Definizione

Produce un handle del metodo adapter che adatta il tipo dell'handle del metodo corrente a un nuovo 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

Parametri

newType
MethodType

tipo previsto del nuovo handle di metodo

Valori restituiti

handle di metodo a this cui delega dopo l'esecuzione di tutte le conversioni di argomenti necessarie e dispone per le conversioni di valori restituiti necessarie

Attributi

Commenti

Produce un handle del metodo adapter che adatta il tipo dell'handle del metodo corrente a un nuovo tipo. L'handle del metodo risultante è garantito per segnalare un tipo uguale al nuovo tipo desiderato.

Se il tipo originale e il nuovo tipo sono uguali, restituisce this.

Il nuovo handle di metodo, quando richiamato, eseguirà i passaggi seguenti: <ul><li>Converte l'elenco di argomenti in ingresso in modo che corrisponda all'elenco di argomenti dell'handle del metodo originale. <li>Invoke l'handle del metodo originale nell'elenco di argomenti convertiti. <li>Convert qualsiasi risultato restituito dall'handle del metodo originale nel tipo restituito di un nuovo handle di metodo. </ul>

Questo metodo fornisce la differenza comportamentale cruciale tra #invokeExact invokeExact e plain, inexact #invoke invoke. I due metodi eseguono gli stessi passaggi quando il descrittore di tipo del chiamante esegue esattamente m atcheggi i tipi del chiamato, ma quando i tipi differiscono, chiama anche asType (#invoke invokeo alcuni equivalenti interni) per trovare la corrispondenza tra i tipi del chiamante e del chiamato.

Se il metodo corrente è una conversione dell'elenco di argomenti dell'handle del metodo di arity variabile può comportare la conversione e la raccolta di diversi argomenti in una matrice, come #asVarargsCollector descritto altrove. In ogni altro caso, tutte le conversioni vengono applicate <em>pairwise</em>, il che significa che ogni argomento o valore restituito viene convertito esattamente in un argomento o valore restituito (o nessun valore restituito). Le conversioni applicate vengono definite consultando i tipi di componente corrispondenti dei tipi di handle di metodi precedenti e nuovi.

Lasciare <che em>T0</em> e <em>T1</em> siano i tipi di parametro nuovi e vecchi corrispondenti o i tipi restituiti vecchi e nuovi. In particolare, per un indice ivalido, lasciare <em>T0</em>=newType.parameterType(i) e <em>T1</em>=this.type().parameterType(i). In alternativa, andando in altro modo per i valori restituiti, lasciare em T0</em>=this.type().returnType() e <em>T1</em=newType.returnType()>.>< Se i tipi sono uguali, il nuovo handle del metodo non apporta alcuna modifica all'argomento o al valore restituito corrispondente (se presente). In caso contrario, una delle conversioni seguenti viene applicata se possibile: <ul<>li>If <em>T0</em> e <em>T1</em> sono riferimenti, viene applicato un cast a <em>T1</em>. I tipi non devono essere correlati in alcun modo specifico. Questo perché un valore dinamico null può essere convertito in qualsiasi tipo di riferimento. <li>Se <em T0</em> e <em>>T1</em> sono primitive, viene applicata una conversione di chiamata al metodo di Java (JLS 5.3), se presente. In particolare, <em T0</em> deve eseguire la conversione in <em>T1</em> da una conversione primitiva di tipo widening. <>li>Se <em>T0</em> è un riferimento primitivo e <em>T1</em>, viene applicata una conversione di cast Java (JLS 5.5) se presente. In particolare, il valore viene sottoposto a boxing da em T0</em> alla relativa classe wrapper, che viene quindi ampliato in base alle esigenze per <em>T1</em>. <><li>Se <em>T0</em> è un riferimento e <em>T1</em> una primitiva, verrà applicata una conversione unboxing in fase di esecuzione, possibilmente seguita da una conversione di chiamata al metodo Java (JLS 5.3) sul valore primitivo. Si tratta delle conversioni primitive di ampliamento. <em>T0</em> deve essere una classe wrapper o un supertipo di uno. Nel caso in cui em T0</em> sia Object, si tratta delle conversioni consentite da java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke.>< La conversione unboxing deve avere una possibilità di esito positivo, il che significa che se em T0</em> non è una classe wrapper, deve esistere almeno una classe <wrapper em>TW</em> che è un sottotipo di <em>T0</em> e il cui valore primitivo unboxed può essere ampliato a <em>T1</em>.>< <li Se il tipo <restituito em T1</em> è contrassegnato come void, qualsiasi valore restituito viene scartato <li>>Se il tipo <restituito em>>T0</em è void e <em>T1</em>> a reference, viene introdotto un valore Null. <li>Se il tipo <restituito em>T0</em> è void e <em>T1</em> una primitiva, viene introdotto un valore zero. </ul> (<em>Note:</em> Entrambi <em>T0</em> e <em>T1</em> possono essere considerati come tipi statici, perché nessuno corrisponde in modo specifico al <tipo< dinamico em>/em> di qualsiasi argomento effettivo o valore restituito).

Non è possibile eseguire la conversione dell'handle del metodo se non è possibile eseguire una delle conversioni pairwise necessarie.

In fase di esecuzione, le conversioni applicate agli argomenti di riferimento o ai valori restituiti possono richiedere controlli di runtime aggiuntivi che possono avere esito negativo. Un'operazione di unboxing potrebbe non riuscire perché il riferimento originale è Null, causando un oggetto java.lang.NullPointerException NullPointerException. Un'operazione unboxing o un cast di riferimento può anche non riuscire in un riferimento a un oggetto di tipo errato, causando un oggetto java.lang.ClassCastException ClassCastException. Anche se un'operazione unboxing può accettare diversi tipi di wrapper, se non sono disponibili, verrà generata un'eccezione ClassCastException .

Documentazione java per java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.

Si applica a