java中是不支持建立参数化类型数组的。
虽然在逻辑上来看应该是可以建立的。但是,我们得注意一件事:java的泛型和C++的泛型不一样,就像张老师在视频里说的,java的泛型是伪泛型,java的泛型只存在于编译时期!
然后我们在说说数组,数组和集合很相似,但是数组是建立以后就不可以改变的,数组中允许存入同一种类型的对象。虚拟机在将对象存入数组的时候会进行运行是检查,以确保存入的对象和运行时的类型相兼容。
String[] str = new String[10];
Object[] objs = str;//不会报错。数组的一个属性;不明白去网上查查;
objs[0]=12;//AUTOBOXING;
Sring s = str[0];//运行时期报错。类型转换异常
如果在泛型中使用数组,这样的检查就显得不那么足够了,因为泛型只在编译时期有效,在运行时期java虚拟机读取不到原来的泛型信息,就因为这个原因就造成了一个类型安全的问题,所以java设计人员避免用户创建参数化的数组。
如果我们假设泛型化的数组可以创建:
ArrayList<String>[] al = new ArrayList<String>[12];
ArrayList<Integer> in = new ArrayList<Integer>();
in.add(12);
Object[] objs = al;//数组特性;
objs[0]= in;//不会报错哦
String ss = al[0].get(0);//类型转换异常。
这就是一个严重的类型安全问题,如果我们没有取出元素,而仅仅是存入,那么我们定义存入的是String但是却实际出入Integer; |