黑马程序员技术交流社区

标题: 泛型高级的问题,求大神指教。 [打印本页]

作者: zippo    时间: 2014-8-5 15:58
标题: 泛型高级的问题,求大神指教。
本帖最后由 zippo 于 2014-8-5 18:02 编辑

// 定义一个方法,把任意参数类型的集合中的数据安全地复制到相应类型的数组中。
看到张老师的课件里有这么一个需求,试着自己做一下,但发现很难下手,不知该从何下起。这是我写的代码。
  1. // 定义一个方法,把任意参数类型的集合中的数据安全地复制到相应类型的数组中。
  2.         public static <T> void copy1(Collection<T> src,T[] dest){
  3.            int length=src.size();//因为不知道数组的长度是否与集合的长度相等,所以要算出数组的长度
  4.            dest = new T[length];//这里就报错了,因为编译器不允许创建泛型变量的数组。
  5.         }
复制代码
这样做是行不通的,但想不出来还有什么法子可以做了,大家一起讨论,看有没有解决办法。

作者: fantacyleo    时间: 2014-8-5 16:10
既然通过参数接收一个数组了,还new一个新的干嘛?直接把src的数据取出来往dest里添加啊
作者: zippo    时间: 2014-8-5 16:13
fantacyleo 发表于 2014-8-5 16:10
既然通过参数接收一个数组了,还new一个新的干嘛?直接把src的数据取出来往dest里添加啊 ...

因为不知道数组的长度是否超过了集合的长度。
作者: fantacyleo    时间: 2014-8-5 16:21
zippo 发表于 2014-8-5 16:13
因为不知道数组的长度是否超过了集合的长度。

数组长度超过集合长度有什么关系?不影响复制啊。就算你认为这样有问题,方法的调用者比你知道的信息多,他不去负责搞一个长度匹配的数组传进来,你作为方法编写者替他着急干嘛?就算你要负这个责,大不了把集合长度作为返回值返回,或者干脆抛异常给方法调用者去处理。
作者: zippo    时间: 2014-8-5 16:46
fantacyleo 发表于 2014-8-5 16:21
数组长度超过集合长度有什么关系?不影响复制啊。就算你认为这样有问题,方法的调用者比你知道的信息多, ...

好吧你这么说有理,我也觉得没必要去操这个心。
作者: 江苏孙浩    时间: 2014-8-5 16:48
想要创建涉及泛型的数组,可以传入一个Class变量,然后用Arrays.newInstance(...)来创建
作者: icris    时间: 2014-8-5 17:26
  1. @SuppressWarnings("unchecked")
  2. public static <T> T[] copy(Collection<T> src) {
  3.         T[] a = null;
  4.         int i = 0;
  5.        
  6.         Iterator<T> it = src.iterator();
  7.         if (it.hasNext()) {
  8.                 T t = it.next();
  9.                 a = (T[]) Array.newInstance(t.getClass(), src.size());
  10.                 a[i] = t;
  11.         }
  12.         while (it.hasNext()) {
  13.                 a[++i] = (T) it.next();
  14.         }
  15.         return a;
  16. }
复制代码

什么都要检查直接不接收参数不就好了…接收了参数就要假定这个就是正确的,要不然可以检查一下
  1. if (a==null||a.length!=src.size()) {
  2.         throw new RuntimeException("数组长度不对");
  3. }
复制代码

作者: 如果有梦    时间: 2014-8-5 17:34
没看很明白
作者: zippo    时间: 2014-8-5 17:39
icris 发表于 2014-8-5 17:26
什么都要检查直接不接收参数不就好了…接收了参数就要假定这个就是正确的,要不然可以检查一下
...

哇,真厉害,懂了,谢谢了。
作者: icris    时间: 2014-8-5 17:52
zippo 发表于 2014-8-5 17:39
哇,真厉害,懂了,谢谢了。

都是现搜现查的…
作者: 裤裆里的温柔、    时间: 2014-8-5 17:54
本帖最后由 裤裆里的温柔、 于 2014-8-5 18:15 编辑
  1. private static <T> T addArr(Collection<T> array) {
  2.         Object[] arr=array.toArray();
  3.         System.out.println(arr.length);
  4.         for(Object obj:arr)
  5.                 System.out.println(obj);
  6.           return (T)arr;
  7. }
  8. 不知道这样可否
复制代码






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