java‘形式泛型类型‘强制转换 50
问题是这样的,在书上说,不能使用泛型类型创建实例,如表达式newE[]或newE[10]就是错误的,所以一般(E[])newObject[capacity]这样解决,但我...
问题是这样的,在书上说,不能使用泛型类型创建实例,如表达式new E[]或new E[10]就是错误的,所以一般(E[])new Object[capacity]这样解决,
但我发现这样不能总是成功的,有些程序会出现java.lang.ClassCastException异常,
这是我写的程序:
public static <E extends Comparable<E>> void mergeSort(E[] list){
if(list.length>1){
//Merge sort the first half
E[] firstHalf=(E[])new Object[list.length/2]; //这里为什么会有错,ClassCastException,??
System.arraycopy(list,0,firstHalf,0,list.length/2);
mergeSort(firstHalf);
//Merge sort the second half
int secondHalfLength=list.length-list.length/2;
E[] secondHalf=(E[])new Object[secondHalfLength];
System.arraycopy(list,list.length/2,secondHalf,0,secondHalfLength);
mergeSort(secondHalf);
//Merge firstHalf with secondHalf
E[] temp=merge(firstHalf,secondHalf);
System.arraycopy(temp,0,list,0,temp.length);
}
}
E[] firstHalf=(E[])new Object[list.length/2];
E[] secondHalf=(E[])new Object[secondHalfLength];
这两句,有警告,但我认为不应该出错呀?下面测试排序算法的程序
String[] str={"zhu","bin","hua","wan","yu"}; //这里会出现ClassCastException异常,为什么??
MergeSort.mergeSort(str);
for(Object element:str)
System.out.print(element+" "); 展开
但我发现这样不能总是成功的,有些程序会出现java.lang.ClassCastException异常,
这是我写的程序:
public static <E extends Comparable<E>> void mergeSort(E[] list){
if(list.length>1){
//Merge sort the first half
E[] firstHalf=(E[])new Object[list.length/2]; //这里为什么会有错,ClassCastException,??
System.arraycopy(list,0,firstHalf,0,list.length/2);
mergeSort(firstHalf);
//Merge sort the second half
int secondHalfLength=list.length-list.length/2;
E[] secondHalf=(E[])new Object[secondHalfLength];
System.arraycopy(list,list.length/2,secondHalf,0,secondHalfLength);
mergeSort(secondHalf);
//Merge firstHalf with secondHalf
E[] temp=merge(firstHalf,secondHalf);
System.arraycopy(temp,0,list,0,temp.length);
}
}
E[] firstHalf=(E[])new Object[list.length/2];
E[] secondHalf=(E[])new Object[secondHalfLength];
这两句,有警告,但我认为不应该出错呀?下面测试排序算法的程序
String[] str={"zhu","bin","hua","wan","yu"}; //这里会出现ClassCastException异常,为什么??
MergeSort.mergeSort(str);
for(Object element:str)
System.out.print(element+" "); 展开
展开全部
E[] firstHalf = (E[]) new Object[list.length / 2];
你这里E编译器只能认定他是Comparable的类型,而你把一个Object直接转肯定出错。Object没实现Comparable接口。而且我建议你别这么用,这个时候你已经知道泛型是Comparable类型了为什么还要用泛型。
而且其实你这个方法系统本身就已经存在了:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
这是Collections类源代码,你看下,很简洁,很值得参考的哦!
你这里E编译器只能认定他是Comparable的类型,而你把一个Object直接转肯定出错。Object没实现Comparable接口。而且我建议你别这么用,这个时候你已经知道泛型是Comparable类型了为什么还要用泛型。
而且其实你这个方法系统本身就已经存在了:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
这是Collections类源代码,你看下,很简洁,很值得参考的哦!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询