打字猴:1.700447596e+09
1700447596
1700447597 }
1700447598
1700447599 阅读完此段代码就很清楚了:toArray方法返回后会进行一次类型转换,Object数组转换成了String数组,于是就报ClassCastException异常了。
1700447600
1700447601 Object数组不能转为String数组,T类型又无法在运行期获得,那该如何解决这个问题呢?其实,要想把一个Obejct数组转换为String数组,只要Object数组的实际类型(Actual Type)也是String就可以了,例如:
1700447602
1700447603 //objArray的实际类型和表面类型都是String数组
1700447604
1700447605 Object[]objArray={“A”,“B”};
1700447606
1700447607 //抛出ClassCastException
1700447608
1700447609 String[]strArray=(String[])objArray;
1700447610
1700447611 String[]ss={“A”,“B”};
1700447612
1700447613 //objs的真实类型是String数组,显示类型为Object数组
1700447614
1700447615 Object[]objs=ss;
1700447616
1700447617 //顺利转换为String数组
1700447618
1700447619 String[]strs=(String[])objs;
1700447620
1700447621 明白了这个问题,我们就把泛型数组声明为泛型类的子类型吧!代码如下:
1700447622
1700447623 public static<T>T[]toArray(List<T>list, Class<T>tClass){
1700447624
1700447625 //声明并初始化一个T类型的数组
1700447626
1700447627 T[]t=(T[])Array.newInstance(tClass, list.size());
1700447628
1700447629 for(int i=0,n=list.size();i<n;i++){
1700447630
1700447631 t[i]=list.get(i);
1700447632
1700447633 }
1700447634
1700447635 return t;
1700447636
1700447637 }
1700447638
1700447639 通过反射类Array声明了一个T类型的数组,由于我们无法在运行期获得泛型类型的参数,因此就需要调用者主动传入T参数类型。此时,客户端再调用就不会出现任何异常了。
1700447640
1700447641 在这里我们看到,当一个泛型类(特别是泛型集合)转变为泛型数组时,泛型数组的真实类型不能是泛型类型的父类型(比如顶层类Object),只能是泛型类型的子类型(当然包括自身类型),否则就会出现类型转换异常。
1700447642
1700447643
1700447644
1700447645
[ 上一页 ]  [ :1.700447596e+09 ]  [ 下一页 ]