1700447523
编写高质量代码:改善Java程序的151个建议 建议100:数组的真实类型必须是泛型类型的子类型
1700447524
1700447525
List接口的toArray方法可以把一个集合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变;toArray(T[]a)虽然返回的是T类型的数组,但是还需要传入一个T类型的数组,这也挺麻烦的,我们期望输入的是一个泛型化的List,这样就能转化为泛型数组了,来看看能不能实现,代码如下:
1700447526
1700447527
public static<T>T[]toArray(List<T>list){
1700447528
1700447529
T[]t=(T[])new Object[list.size()];
1700447530
1700447531
for(int i=0,n=list.size();i<n;i++){
1700447532
1700447533
t[i]=list.get(i);
1700447534
1700447535
}
1700447536
1700447537
return t;
1700447538
1700447539
}
1700447540
1700447541
上面把要输出的参数类型定义为Object数组,然后转型为T类型数组,之后遍历List赋值给数组的每个元素,这与ArrayList的toArray方法很类似(注意只是类似),客户端的调用如下:
1700447542
1700447543
public static void main(String[]args){
1700447544
1700447545
List<String>list=Arrays.asList(“A”,“B”);
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){
[
上一页 ]
[ :1.700447522e+09 ]
[
下一页 ]