打字猴:1.700447546e+09
1700447546
1700447547 for(String str:toArray(list)){
1700447548
1700447549 System.out.println(str);
1700447550
1700447551 }
1700447552
1700447553 }
1700447554
1700447555 编译没有任何问题,运行后出现如下异常:
1700447556
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 }
[ 上一页 ]  [ :1.700447546e+09 ]  [ 下一页 ]