java 泛型数组 深度解析

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

在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.         System.out.print("接收泛型数组:") ;  
  6.         for(T t:param){  
  7.             System.out.print(t + "、") ;  
  8.         }  
  9.     } 

三、不能作为实际块内代码存在
public class GArrayT<T> {
private  T[] arr;//这样是不行的

public GArrayT(int capacity) {
arr = new T[capacity];
System.out.println("End");
}
}


你可能感兴趣的:(java 泛型数组 深度解析)