java不允许创建泛型数组,原因可以网上查,创建数组只能使用具体化类型,你要想这样使用,可以使用容器。

解决方案 »

  1.   

    首先是不能创建参数化类型的数组的。
    原因:由于泛型存在擦除机制,所以Peel<Banana>[] peels = new Peel<Banana>[10];会变成Peel [] peels = new Peel[10];然后问题就来了,你可以将peels转成Object[]类型,然后往peels里面任意塞东西(object类型嘛),如peels[0]="我是String类型也能存进来了,但不是Banana类型的"。显然这样的赋值是要报错的,ArrayStoreException。因为,虽然有擦除,但是有“补偿”(就是数组会记住自己实际的存储类型,这里就是Banana类型),所以你存入String类型的那句话就出错了,但从理论上往Object类型的数组中存String类型又是合法的。故为了避免这种矛盾,不允许创建参数化类型的数组。
      

  2.   

    首先,数组与泛型的一个区别是数组是具体化的,泛型是通过擦除实现的,两者不能很好的混合使用。
    然后,泛型,参数化类型或者类型参数化,如E、List<E>、List<String>这样的类型称作不可具体化类型,创建它们的数组是非法的,因为它们是不安全的。有一种例外如List<?>[] ls = new ArrayList<?>[5]是合法的。
    最后,要使用泛型数组,可以绕过创建泛型数组的禁令:创建Object的数组,并将它转化成泛型数组类型。但是你要自己证明这种转换是类型安全的。例如,在转化是类型安全的情况下可以这样:@SuppressWarnings("unchecked") E[] e = (E[]) new Object[5];