首頁  >  文章  >  Java  >  Java泛型擦除的原理是什麼

Java泛型擦除的原理是什麼

王林
王林轉載
2023-05-09 12:40:171389瀏覽

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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除