1700447572
1700447573
//此处的强制类型没必要存在,只是为了与源代码对比
1700447574
1700447575
Object[]t=(Object[])new Object[list.size()];
1700447576
1700447577
for(int i=0,n=list.size();i<n;i++){
1700447578
1700447579
t[i]=list.get(i);
1700447580
1700447581
}
1700447582
1700447583
return t;
1700447584
1700447585
}
1700447586
1700447587
public static void main(String[]args){
1700447588
1700447589
List<String>list=Arrays.asList(“A”,“B”);
1700447590
1700447591
for(String str:(String[])toArray(list)){
1700447592
1700447593
System.out.println(str);
1700447594
1700447595
}
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
明白了这个问题,我们就把泛型数组声明为泛型类的子类型吧!代码如下:
[
上一页 ]
[ :1.700447572e+09 ]
[
下一页 ]