1700447557
Exception in thread”main”java.lang.ClassCastException:[Ljava.lang.Object;
1700447558
1700447559
cannot be cast to[Ljava.lang.String;at Client.main(Client.java:20)
1700447560
1700447561
类型转换异常,也就是说不能把一个Object数组转换为String数组,这段异常包含了两个问题:
1700447562
1700447563
为什么Object数组不能向下转型为String数组?
1700447564
1700447565
数组是一个容器,只有确保容器内的所有元素类型与期望的类型有父子关系时才能转换,Object数组只能保证数组内的元素是Object类型,却不能确保它们都是String的父类型或子类,所以类型转换失败。
1700447566
1700447567
为什么是main方法抛出异常,而不是toArray方法?
1700447568
1700447569
其实,是在toArray方法中进行的类型向下转换,而不是main方法中。那为什么异常会在main方法中抛出,应该在toArray方法的“T[]t=(T[])new Object[list.size()]”这段代码才对呀?那是因为泛型是类型擦除的,toArray方法经过编译后与如下代码相同:
1700447570
1700447571
public static Object[]toArray(List list){
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
[
上一页 ]
[ :1.700447557e+09 ]
[
下一页 ]