[英]What's the difference between the generic array and the generic value?
public class Array<T> {
private Object[] array;
public Array(int sz) {
array = new Object[sz];
}
// ....
public T get(int index) { return (T)array[index]; }
public T[] rep() { return (T[])array; }
}
為什么編譯器說(T[])array
是未經檢查的強制轉換,然后在我使用rep()
方法時引發ClassCastException
? 當我使用get()
方法()時為什么不拋出此異常?
為什么在我使用get()方法()時未引發此異常?
有兩個原因 :
array
添加任何元素,則將使用sz
個null
值初始化array
。. (T)array[index]
語句試圖將null
轉換為T
(其中T
本質上是通過類型擦除替換為Object
)。 可以將null
強制轉換為任何類型,因此這不是問題。 array
中,則語句(T)array[index]
可以正常工作的唯一方法是,位置index
處的元素是否是用於實例化Array
的相同類型或子類型(例如Array<Number> arr = new Array<Number>
而arr[index]
為1。這不是問題;但是,嘗試在arr[index]
處插入一個String
,您肯定會從get
ClassCastException
。方法) 為什么編譯器說(T [])數組是未經檢查的強制轉換,然后在我使用rep()時拋出ClassCastException
獲得ClassCastException
的唯一方法是T
表示的類型與array
可以容納的元素的類型不同。 例如,執行以下操作將導致ClassCastException
:
Array<Integer> a = new Array<Integer>();
Integer[] intArray = a.rep();//ClassCastException
在這里, T[]
表示一個Integer[]
因此在編譯代碼時沒有問題。 但是,在運行時, array
的類型為Object[]
。 Object
數組不能向下轉換為Integer
數組。 知道數組是由JVM與其他類不同的動態創建的,這也將有所幫助。
解決此問題的一種方法是將Array
實例化為Array<Object> arr = new Array<Object>
。
在get()
,您只關心數組中元素的實際運行時類型,我認為這是正確的,因為您有某種方法只能將T
放入數組中。 數組的實際運行時類型無關緊要。
在rep()
,您關心數組對象的實際運行時類型,因為您將其強制轉換為T[]
。 您使用實際的運行時類型Object[]
創建了數組,因此,除非T
恰好是Object
否則對T[]
的強制轉換將始終不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.