黑马程序员技术交流社区

标题: 泛型类型可以放在数组里,你试过没有? [打印本页]

作者: 王杰    时间: 2012-4-28 22:46
标题: 泛型类型可以放在数组里,你试过没有?
本帖最后由 王杰 于 2012-4-28 23:11 编辑

我们知道数组里面可以放八种基本数据类型和引用类型,那么为什么不能创建泛型数组呢?
比如:
  1. ArrayList<String>[] al  = new ArrayList<String>[10];
  2. Vector<Integer>[] vec = new Vector<Integer>[6];
复制代码

作者: 根号5    时间: 2012-4-28 22:54
呵呵  哥们  这个问题我以前也提问过,好像没人真正研究过这玩意 老师也不给技术分,可能没答案吧
作者: 亚男    时间: 2012-4-28 23:09
泛型是规范,目的是不让违规操作或赋值,数组是存放同一类型内容的集合,这个集合必须实际存在,把这编译后就被擦除掉的泛型放在数组里不合适吧?
作者: 罗旭维    时间: 2012-4-28 23:48
创建数组的前提是编译器能推测出可能发生在数组元素对象上的操作。
因为java判定类型的依据是此类型支持那些操作,显然在代码里你定义了数组肯定之后会对数组元素进行操作、
当java能判定这个数组元素能支持什么操作之后才能检测之后代码里对数组元素操作的正确性,才能报出操作的错误,
当java无法做出判断的时候就无法编译通过,显然如果数组的元素是范型对象,其类型无法判定,那对其操作的正确性就无法判定,就编译通不过。
作者: 王杰    时间: 2012-4-29 00:00
罗旭维 发表于 2012-4-28 23:48
创建数组的前提是编译器能推测出可能发生在数组元素对象上的操作。
因为java判定类型的依据是此类型支持那 ...

Vector<Integer>[] vec = new Vector<Integer>[6];
我在数组里放的是一个Vector<Integer>(参数化的泛型)难道这样还叫不明确吗?
作者: 罗旭维    时间: 2012-4-29 00:23
王杰 发表于 2012-4-29 00:00
Vector[] vec = new Vector[6];
我在数组里放的是一个Vector(参数化的泛型)难道这样还叫不明确吗? ...

既然是范型的所以你可以是Vector<Interger>也可以是Vector<Short>也可以是其他任何类型,但当然你在代码里明确声明了是某种类型,但编译器判断的依据是类不是对象。
作者: 王杰    时间: 2012-4-29 00:31
罗旭维 发表于 2012-4-29 00:23
既然是范型的所以你可以是Vector也可以是Vector也可以是其他任何类型,但当然你在代码里明确声明了是某种 ...
  1. 打错了
  2. ArrayList<String>[] al  = new ArrayList<String>[10];
  3. 像上面这句,我已经指明了是一个ArrayList<String>,那就不会是ArrayList<Integer>了。
  4. 为什么还是报错呢?
复制代码

作者: 王冬冬    时间: 2012-4-29 12:49
我也尝试过,就是好奇,但一写代码就发现有矛盾。
元素类型[] 数组名=new 元素类型[元素个数或数组长度]
本来数组的定义就已经指明了元素类型,不论是基本数据类型还是封装的对象。泛型的出现也正是为了解决这个问题(在集合中就是因为可以存储不同对象,可能在运行过程中出现编译时发现不了的错误)如果明确对象的类型,编译时就能发现并及时解决。个人理解这就像是用从老师那学到的知识在来教老师,不切合实际也多此一举。
作者: 倪杭乘    时间: 2012-4-29 13:18
泛型是给集合用的,数组不具备这个“功能”。
泛型的功能是指定传入引用数据的类型。
其实数组在定义时已经明确了需要储存的数据类型,就算泛型能够使用,就跟数组的定义冲突或者重复
作者: 林德燚    时间: 2012-4-29 14:39
01.ArrayList<String>[] al  = new ArrayList<String>[10];
02.Vector<Integer>[] vec = new Vector<Integer>[6];

1、泛型是在编译时期使用的,在运行时起不到作用;
2、你这也不叫泛型数组,在运行时就会被看成Vectoc[] 容器数组;
作者: 李震 李震 李震    时间: 2012-4-29 15:15
本帖最后由 黑马我来了 于 2012-4-29 15:18 编辑

  ArrayList本身就是个容器,而ArrayList这个容器底层就是把数据放入数组里面的,里面已经实现了数组。那外面在定义一个数组,数据放进去放入数组,然后数组中放入数组,这样的话意义不大吧!
作者: 王杰    时间: 2012-4-29 20:35
黑马我来了 发表于 2012-4-29 15:15
ArrayList本身就是个容器,而ArrayList这个容器底层就是把数据放入数组里面的,里面已经实现了数组。那外 ...

感觉你说的不一定对,比如int[][] arrs = new int[10][10];这个就是如你所说的,不是挺有意义吗




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