1、說明
在編譯過程中,可以獲得類型變數的資訊。因此,set方法可以在編譯器中進行類型檢查,非法類型不能通過編譯。但對於get方法,由於擦除機制,操作時的實際參考類型是Object類型。
為了恢復回傳結果的類型,編譯器在get後加入了型別轉換。因此,在genericHolder.class檔案main方法主體的第18行有型別轉換的邏輯。這是編譯器自動加入的。
因此,我們處理了泛型物件的讀寫位置,並對程式碼新增了限制。
2、實例
//GenericHolder.java public class GenericHolder<T> { T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public static void main(String[] args) { GenericHolder<String> holder = new GenericHolder<>(); holder.setObj("Item"); String s = holder.getObj(); } } //GenericHolder.class public class GenericHolder<T> { T obj; public GenericHolder(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public T getObj(); Code: 0: aload_0 1: getfield #2 // Field obj:Ljava/lang/Object; 4: areturn public void setObj(T); Code: 0: aload_0 1: aload_1 2: putfield #2 // Field obj:Ljava/lang/Object; 5: return public static void main(java.lang.String[]); Code: 0: new #3 // class GenericHolder 3: dup 4: invokespecial #4 // Method "<init>":()V 7: astore_1 8: aload_1 9: ldc #5 // String Item 11: invokevirtual #6 // Method setObj:(Ljava/lang/Object;)V 14: aload_1 15: invokevirtual #7 // Method getObj:()Ljava/lang/Object; 18: checkcast #8 // class java/lang/String 21: astore_2 22: return }
以上是Java泛型擦除的原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!