泛型数组 只能作为参数类型 或者 函数参数


在Java中,Object[]数组可以是任何数组的父类,或者说,任何一个数组都可以向上转型成父类的数组,这个时候如果我们往里面放不同于原始数据类型 但是满足后来使用的父类类型的话,编译不会有问题,但是在运行时会检查加入数组的对象的类型,于是会抛ArrayStoreException:

 

String[] strArray = new String[20];

Object[] objArray = strArray;

objArray[0] = new Integer(1); // throws ArrayStoreException at runtime




一、 参数类型


1.  泛型list的数组,形如: ArrayList<T>[]

ArrayList<T>[] list = new ArrayList<T>[n];



for(int i = 0; i < n; i++){



list[i] = new ArrayList<T>;



}





2.泛型数组的集合,形如:ArrayList<T[n]>



import java.lang.reflect.Array;



...



ArrayList<T[n]> lst = new ArrayList<T[n]>;



lst.add((T[])Array.newInstance(type,size));



Type类型为Class<T>,需要调用者指定,size为要开辟的数组长度;



另外,具体创建数组中的参数,也需要用type来指定。



T[] t = lst.get(0);



for (int i = 0; i < size; i++)



t[] = type.newInstance();


二、  函数参数


1. public static <T> T[] fun1(T...arg){  // 接收可变参数  
2. return arg ;            // 返回泛型数组  
3.     }  
4. public static <T> void fun2(T param[]){   // 输出  
5. "接收泛型数组:") ;  
6. for(T t:param){  
7. "、") ;  
8.         }  
9.     }




三、不能作为实际块内代码存在



public class GArrayT<T> { 
  
 
  
private  
   T[] arr;//这样是不行的 
  
 
  
 
   
 
  
public GArrayT(int capacity) { 
  
 
  
arr = new T[capacity]; 
  
 
  
System.out.println("End"); 
  
 
  
} 
  
 
  

    }