[英]Java type erasure and Arrays
甲骨文文檔說,泛型使用一種技術調用類型擦除在Java中實現,這就是它的工作方式。
因此,如果我有一個通用類,請說如下容器:
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.