A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.util.Collection;
  2. import java.util.HashSet;

  3. public class WrongExample  {
  4.         public static void main(String[] args) {
  5.                
  6.                 Collection<String> coll = new HashSet<String>();
  7.                 coll.add("abc1");
  8.                 coll.add("abc2");
  9.                 coll.add("abc3");
  10.                 coll.add("abc4");
  11.                 collectionToArray(coll);
  12.         }
  13.        
  14.         public static <T> T[] collectionToArray(Collection<T> coll){
  15.                 int num = 0;
  16.                 //此处报错 提示信息为:Cannot create a generic array of T,
  17.                 //我感觉这没错啊,你看声明一个T类型的数组,长度为 集合的长度。这没问题啊
  18.                 T [] arr = new T[coll.size()];
  19.                
  20.                 for(T t : coll){
  21.                         arr[num] = t;
  22.                         num++;
  23.                 }
  24.                 return arr;
  25.         }
  26. }
复制代码

错误内容在,注释中有说明,大神求解释...

评分

参与人数 1技术分 +1 收起 理由
舍我其谁 + 1

查看全部评分

12 个回复

倒序浏览
  不能用new T[]方式来创建数组,    java提供了一个Array类,可以通过它实现。      T [] arr = (T[]) Array.newInstance(Object.class,coll.size());   

评分

参与人数 1技术分 +1 收起 理由
舍我其谁 + 1

查看全部评分

回复 使用道具 举报
角标是List集合的特点,set集合是没有的。
回复 使用道具 举报
应该已经解决了吧。
回复 使用道具 举报
我只是来转个圈,网速不好。赶紧挣黑马币类。
回复 使用道具 举报
xpaibeyond 发表于 2014-9-17 00:34
不能用new T[]方式来创建数组,    java提供了一个Array类,可以通过它实现。      T [] arr = (T[]) Arr ...

我试了下,确实OK了,不过我还是想问下,为什么不能用new T[]这种方式创建数组,逻辑上应该是没有问题的啊,我的泛型是T类型,然后创建一个数组,不是应该没问题的么?

另外,假如在主函数中,将返回的数组赋值给一个String类型的数组,会出现classCaseException的错误,内容是[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;  但是在方法上已经定义了返回类型是T啊,如果说这里涉及到参数类型的类型推断的话,也应该是String的啊,调用方法的时候,所有的类型都是T并没有产生冲突,所以不会去最大交集啊。更何况就算存在,也应该以返回值类型为主要判断依据啊...
回复 使用道具 举报
杨列振 发表于 2014-9-17 09:15
应该已经解决了吧。

又遇到新问题了,请看上一楼
回复 使用道具 举报
そ花痕ゐ蝶梦 发表于 2014-9-17 07:48
角标是List集合的特点,set集合是没有的。

兄弟,这里没有用到角标啊,数组的角标是根据计数器得到的,只是数组的长度用的是set集合的长度而已...{:3_53:}
回复 使用道具 举报
残羹夜宴丶 发表于 2014-9-17 12:27
我只是来转个圈,网速不好。赶紧挣黑马币类。

今天不上山了?
回复 使用道具 举报
clh 中级黑马 2014-9-17 16:20:31
10#
。。。。T是泛型,但是要用实际的类型去替代啊,比如String
回复 使用道具 举报
clh 中级黑马 2014-9-17 16:22:13
11#
Mr_Unhappy 发表于 2014-9-17 14:43
我试了下,确实OK了,不过我还是想问下,为什么不能用new T[]这种方式创建数组,逻辑上应该是没有问题的 ...

你视屏看了没啊,有错就throws或try,,,catch
回复 使用道具 举报
clh 发表于 2014-9-17 16:22
你视屏看了没啊,有错就throws或try,,,catch

try catch是没错,但是catch代码块里要写处理方法,现在就算你把错误捕捉到,你不是还是不能处理么,你接着抛出去,又有啥用?catch代码块里,你要写什么样的处理方法?
回复 使用道具 举报
Mr_Unhappy 发表于 2014-9-17 14:43
我试了下,确实OK了,不过我还是想问下,为什么不能用new T[]这种方式创建数组,逻辑上应该是没有问题的 ...


逻辑上看来是行得通的,但java就是不允许这么干,归根结底是跟泛型擦除机制有关。

coll中是存的String类型的数据,     T [] arr = (T[])Array.newInstance(Object.class, coll.size());  这个数组指定的是Object类型。  任何引用类型的数据都可以往arr里存,  由于泛型的擦除机制, Java虚拟机运行时是不知道泛型信息的,  所以在强制转换的时候会抛强制转换异常。  

想返回的数组赋给一个String数组,这样可以:T [] arr = (T[])Array.newInstance(String.class, coll.size());  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马