在java中,不能通過直接通過T[] tarr=new T[10]的方式來創建數組,最簡單的方式便是通過Array.newInstance(Class<t>type,int size)的方式來創建數組例如下面的程序
- public class ArrayMaker<T> {
- private Class<T> type;
-
- public ArrayMaker(Class<T> type) {
- this.type = type;
- }
-
- @SuppressWarnings("unchecked")
- T[] createArray(int size) {
- return (T[]) Array.newInstance(type, size);
- }
-
- List<T> createList() {
- return new ArrayList<T>();
- }
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- /*
- * Even though kind is stored as Class<T> , erasure means that it is actually just being stored as a Class, with
- * no parameter. So, when you do some thing with it, as in creating an array, Array.newInstance( ) doesn’t
- * actually have the type information that’s implied in kind; so it cannot produce the specific result, wh ich
- * must therefore be cast, which produces a warning that you cannot satisfy.
- */
- ArrayMaker<Type> am2 = new ArrayMaker<Type>(Type.class);
- System.out.println(Arrays.asList(am2.createArray(10)));
- System.out.println(Arrays.asList(am2.createList()));
- }
-
- }
-
- class Type {
- @Override
- public String toString() {
- return "type";
- }
- }
上面的這個例子比較簡單,但是如果你有接觸過泛型數組,你便對他的復雜度有一定的了解,由於創建泛型數組比較復雜,所以在實際的應用過程中一般會選擇List的對泛型進行存儲,如果實在需要使用泛型數組,則需要注意數組的在運行時的類型,think in java這本書中,對泛型數組的處理通過四個小程序對其進行了比較完整的描述
程序一:這個程序主要說明了,在使用泛型數組中容易出現的問題,由於書中對於程序的說明比較詳細,所以只對程序做引用
- class Generic<T> {
- }
-
- public class ArrayofGeneric {
- public static void main(String[] args) {
- Generic<Integer>[] genArr;
- /*
- * will throw ClassCastException :The problem is that arrays keep track of their actual type, and that type is
- * established at the point of creation of the array. So even though genArr has been cast to a Generic < Integer
- * >[] , that information only exists at compile time (and without the @SuppressWarnings annotation, you’d get a
- * warning for that cast). At run time, it’s still an array of Object, and that causes problems.
- */
- // genArr = (Generic<Integer>[]) new Object[] {};
- /* can not create a generic of array */
- // genArr=new Generic<Integer>[2];
- genArr = (Generic<Integer>[]) new Generic[2];
- System.out.println(genArr);
- }
- }
程序二:這個程序主要是說明在程序的執行過程中,泛型數組的類型信息會被擦除,且在運行的過程中數組的類型有且僅有Object[],如果我們強制轉換成T[]類型的話,雖然在編譯的時候不會有異常產生,但是運行時會有ClassCastException拋出
- /**
- *
- * Because of erasure, the runtime type of the array can only be Object[]. If we immediately cast it to T[], then at
- * compile time the actual type of the array is lost, and the compiler may miss out on some potential error checks.
- *
- *
- *
- * archive $ProjectName: $
- *
- * @author Admin
- *
- * @version $Revision: $ $Name: $
- */
- public class ArrayOfGeneric2<T> {
- public T[] ts;
-
- public ArrayOfGeneric2(int size) {
- ts = (T[]) new Object[size];
- }
-
- public T get(int index) {
- return ts[index];
- }
-
- public T[] rep() {
- return ts;
- }
-
- public void set(int index, T t) {
- ts[index] = t;
- }
-
- public static void main(String[] args) {
- ArrayOfGeneric2<String> aog2 = new ArrayOfGeneric2<String>(10);
- Object[] objs = aog2.rep();
- System.out.println(objs);
- /* will throw ClassCastException */
- // String[] strs = aog2.rep();
- // System.out.println(strs);
- }
-
- }