Язык

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. Два метода выполняют одни и те же действия, когда дескриптор типа вызывающего объекта точно ммешает вызываемого объекта, но если типы отличаются, простые #invoke invoke вызовы asType (или некоторые внутренние эквиваленты), чтобы соответствовать типам вызывающего и вызываемого абонента.

Если текущий метод является методом обработки списка аргументов переменной arity, может включать преобразование и коллекцию нескольких аргументов в массив, как #asVarargsCollector описано в другом месте. Во всех остальных случаях все преобразования применяются <>по паре< em/em>, что означает, что каждый аргумент или возвращаемое значение преобразуется в ровно один аргумент или возвращаемое значение (или нет возвращаемого значения). Примененные преобразования определяются путем консультации с соответствующими типами компонентов старых и новых типов дескрипторов методов.

Позвольте <em>T0</em> и <em>T1</em> соответствовать новым и старым типам параметров или старым и новым типам возвращаемых значений. В частности, для определенного допустимого индекса iдавайте эм>< 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> является объектом, это преобразования, разрешенные 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, любое возвращаемое значение отбрасывается <ли>, если возвращаемый тип <<>em T0</em> void и <em>T1</em> ссылка, будет введено значение NULL. <li>, если возвращаемый тип>< em T0</>em является void и <em>T1</em> примитивом, будет введено нулевое значение. </ul> (<>em Note:</em><em>T0</em> и <em>T1</em> могут рассматриваться как статические типы, так как ни один из них не соответствует конкретно динамическому>< типу</em> любого фактического аргумента или возвращаемого значения.)

Преобразование дескриптора метода невозможно сделать, если невозможно выполнить одно из обязательных парных преобразований.

Во время выполнения преобразования, применяемые к ссылочным аргументам или возвращаемым значениям, могут потребовать дополнительных проверок среды выполнения, которые могут завершиться ошибкой. Операция распаковки может завершиться ошибкой, так как исходная ссылка имеет значение NULL, что приводит к возникновению java.lang.NullPointerException NullPointerExceptionпроблемы. Операция распаковки или приведение ссылок также может завершиться ошибкой ссылки на объект неправильного типа, что приводит к возникновению java.lang.ClassCastException ClassCastExceptionошибки. Несмотря на то, что операция распаковки может принимать несколько видов оболочки, если они недоступны, ClassCastException создается исключение.

Java документации по java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType).

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

Применяется к