黑马程序员技术交流社区

标题: 请教:能不能创建泛型数组? [打印本页]

作者: 乔建国    时间: 2012-5-11 21:39
标题: 请教:能不能创建泛型数组?
可以创建一个泛型数组引用,如List<String>[] ls; 编译时不会报错,
但List<String>[] ls=new List<String>[9];  就会报错。
作者: 王杰    时间: 2012-5-11 22:03
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;
作者: 小小企鹅    时间: 2012-5-12 08:44
本帖最后由 小小企鹅 于 2012-10-27 22:37 编辑

List是一个集合,长度不固定。
List<String> ls = new List<String>()





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2