數組是協變的(convariant),如果Sub是Super的子類型,那麼數組類型Sub[]就是Super[]的子類型。
Object[] obs=new Long[1];
obs[0]="hhe";
這是可以的泛型卻是不可變的,List<Sub>不是List<Super>的子類型。
List<Object> list=new ArrayList<Long>();//編譯錯誤
list.add("hhe");
數組是具體化的(reified),因此數組在運行時才知道並檢查它們的元素類型約束。
泛型則是通過擦除(erasure)來實現,因此泛型只在編譯時強化它們的類型信息,並在運行時丟棄(或者擦除)它們的元素類型約束。擦除就是使泛型可以與沒有使用泛型的代碼隨意進行互用。
所以一般來說,數值和泛型不能互用,所以發現錯誤第一反應就應該是用列表代替數值。