2016-08-15 53 views
0
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是未勾選的cast,然後ClassCastException在我使用rep()的方法時拋出? 爲什麼當我使用get()方法()時不會拋出此異常?泛型數組和泛型值有什麼區別?

+1

您的問題與泛型沒有任何關係。這對你很有趣:[here](http://stackoverflow.com/a/13647072/5333936) – Blobonat

+0

簡短回答:由於擦除,不能轉換爲泛型類型。使用'List '代替'Object []'。 – VGR

回答

1

爲什麼在使用get()方法()時不會拋出此異常?

有兩個原因:

  1. 假設沒有元素被你的程序中加入array,該array是要與sznull值。該聲明(T)array[index]是被初始化試圖將null轉換成T(其中T基本上通過類型擦除被Object取代)。 A null可以投入任何類型,所以這不是一個問題。
  2. 假設一些元素被添加到array在你的程序,該語句(T)array[index]將沒有任何問題的唯一方法是,如果在index位置的元素是用於實例Array相同類型或亞型(如Array<Number> arr = new Array<Number>arr[index]爲1。這不會是一個問題,但是,嘗試插入Stringarr[index]和你一定會從get方法得到了ClassCastException以及)

爲什麼編譯器說( T [])數組未經檢查強制轉換,然後Class當我使用代表()CastException拋出

讓你獲得一個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>

1

get()中,您只關心數組內部元素的實際運行時類型,我認爲這是正確的,因爲您有一些方法只將T放入數組中。數組的實際運行時類型無關緊要。

rep()中,您關心數組對象的實際運行時類型,因爲您將它轉換爲T[]。您創建了實際運行時類型爲Object[]的陣列,因此投到T[]將始終不正確,除非T碰巧是Object

相關問題