語言

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。 當呼叫者的型別描述符 m 恰好 atping 被叫者的時,這兩種方法執行相同的步驟;但當類型不同時,plain #invoke invoke 也會呼叫 asType (或某種內部等效)來匹配呼叫者與被叫者的類型。

若目前方法為變元數方法,處理參數列表轉換可能涉及將多個參數轉換並收集成陣列,如 #asVarargsCollector 其他地方所述。 在其他情況下,所有轉換都是以 em>成對/<em> 方式套用<,也就是說每個參數或回傳值都只會轉換成一個參數或回傳值(或沒有回傳值)。 套用的轉換是透過參考舊方法與新方法的對應元件類型來定義的。

設 <em>T0</em> 和 <em>T1</em> 分別是對應的新舊參數類型,或舊的與新的回傳類型。 具體來說,對於某個有效的指標i,設 <em>為 T0</em,em <>=newType.parameterType(i)>為 T1</em。>=this.type().parameterType(i) 或者,反過來,讓 <em 用 T0</em=this.type().returnType()>,讓 <T1></em>=newType.returnType()。> 若型別相同,新方法的代號不會改變對應的參數或回傳值(若有)。 否則,若可能,會套用以下其中一種轉換:<ul<>li>若 <em>T0</em> 與 <em>T1</em> 為參考,則會套用鑄造至 <em>T1</em>。 (類型不必有特定關聯。這是因為動態值 null 可以轉換成任何參考型別。)<李>如果 <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,則任何返回值都會被丟棄 <li>;如果返回類型 <em>T0</em> 為 void,且 <em>T1</em> 為參考,則會引入一個空值。 <li>若回傳類型 <em>T0</em> 為空<且 M1></em> 為原元,則引入零值。 </ul><(em>註:</em <>> em T0</em> 和 <em>T1</em> 都可以視為靜態型別,因為兩者都不特定對<應任何實際參數或回傳值的 em>動態型別</em>。)

若無法完成任何一對對轉換,則無法進行方法把柄轉換。

執行時,對參考參數或回傳值的轉換可能需要額外的執行檢查,但這可能會失敗。 開箱操作可能失敗,因為原始參考為空,導致 java.lang.NullPointerException NullPointerException。 開箱操作或參考鑄造也可能在錯誤類型的物件參照時失敗,導致 java.lang.ClassCastException ClassCastException。 雖然開箱操作可能接受多種包裝,但若無可用包裝,則會拋出 a ClassCastException

java.lang.invoke.MethodHandle.asType(java.lang.invoke.MethodType)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於