public class ArrayOfGeneric{ static Generic<Integer>[] gia; @SupperssWarnings("unchecked") public static void main(String[] args){ gia = (Generic<Integer>[])new Generic[100]; // 經過類型轉換匿名對象 //! gia[0] = new Object(); //編譯不經過,不能(直接)建立泛型數組實例 } }
public class GenericArray<T> { private T[] array; @SupperessWarning("unchecked") public GenericArray(int sz) { array = (T[]) new Object[sz]; } public void put(int index, T item) { array[index] = item; } public T get(int index) { return array[index]; } public T[] rep() { return array; } //應該在運行時出口作文章 public static void main (String[] args){ GenericArray<Integer> gai = new GenericArray<Integer>(10); // Integer[] ia = gai.rep(); //ClassCastException Object[] oa = gai.rep(); //只能返回對象數組類型爲Object[]
public class GenericArray2<T> { private Object[] array; //維護Object[]類型數組 @SupperessWarning("unchecked") public GenericArray2(int sz) { array = new Object[sz]; } public void put(int index, T item) { array[index] = item; } public T get(int index) { return (T)array[index]; }//數組對象出口強轉 public T[] rep() { return (T[])array; } //運行時不管怎樣都是Object[]類型 public static void main (String[] args){ GenericArray<Integer> gai = new GenericArray<Integer>(10); // Integer[] ia = gai.rep(); //依舊ClassCastException Object[] oa = gai.rep(); //只能返回對象數組類型爲Object[] gai.put(0,11); System.out.println(gai.get(0)); // 11 ,出口成功轉型 } }
import java.lang.reflect.*; public class GenericArrayWithTypeToken<T> { private T[] array; @SuppressWarning("unchecked") public GenericArrayWithTypeToken(Class<T> type, int sz) { array = (T[]) Array.newInstance(type, sz);//經過反射在運行時構出實際類型爲type[]的對象數組,避免了類型擦除,從而轉換成功,無ClassCastException } public void put(int index, T item){ array[index] = item; } public T get(int index) { return array[index]; } public T[] rep() { return array; } //能成功返回了~ public static void main(String[] args) { GenericArrayWithTypeToken<Integer> gawtt = new GenericArrayWithTypeToken<>(Integer.class, 10); Integer[] ia = gawtt.rep(); //能成功返回了! } }