簡體   English   中英

Java類型擦除和數組

[英]Java type erasure and Arrays

甲骨文文檔說,泛型使用一種技術調用類型擦除在Java中實現,這就是它的工作方式。

  1. 如果類型參數不受限制,則將通用類型中的所有類型參數替換為其邊界或對象。 因此,產生的字節碼僅包含普通的類,接口和方法。
  2. 必要時插入類型轉換,以保持類型安全。
  3. 生成橋接方法以在擴展的泛型類型中保留多態。

因此,如果我有一個通用類,請說如下容器:

class Container<T>{
T initialValue;
List<T> valueList=new ArrayList<T>();
public List<T> getValueList(){
  return valueList;
}

}

經過類型擦除處理后,它的等效類看起來像:

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    public List getValueList(){
      return valueList;
    }

    }

如果這里有錯請指正

同樣,如果修改上面的類如下

class Container<T>{
    T initialValue;
    List<T> valueList=new ArrayList<T>();
    T[] arrayValue;
    public Container(T[] array){
       arrayValue=array;
     }
    public List<T> getValueList(){
      return valueList;
    }

    }

會不會等於???

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    Object[] arrayValue;
    public Container(Object[] array){
       arrayValue=array;
     }
    public List getValueList(){
      return valueList;
    }

    }

如果是這樣,那么我也應該這樣: T[] arrayValue=new T[10]; //編譯時錯誤; 因為上面的語句將被轉換為

Object[] arrayValue=new Object[10];

需要澄清類型擦除如何在Java中用於數組嗎?

您不能創建通用數組。 原因是數組早於Java的泛型,並且數組不使用類型擦除。 因此,例如, Integer[]String[]在運行時確實具有不同的類型。 如果編寫new T[] ,則編譯器將不知道需要創建哪種數組。

您可以通過執行以下操作來創建偽造的通用數組:

T[] array = (T[]) new Object[10];

但是您必須記住,您實際上創建了一個Object數組,而不是T數組。 在運行時可以在其中放置非T實例,因此只有在數組是您的類的私有字段且永遠不會傳遞給其他對象的情況下才可以這樣做,以便您可以精確地控制將哪些對象放置在對象中。陣列。

如果您具有Class<T>實例(所謂的類型令牌),則可以使用Array.newInstance創建具有正確的運行時類型的新數組:

T[] array = (T[]) Array.newInstance(typeToken, 10); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM