遇到一个关于创建泛型数组的问题,在网上百度了很多,给出的方法基本上都是
E[] array= (E[]) new Object[length];
但是在我本地运行时却一直报错,下面是报错的代码,报错位置为第三行
private static <E extends Comparable<E>> void mergeSort(E[] list){
if(list.length > 1){
E[] listFirst = (E[]) new Object[list.length / 2];
System.arraycopy(list, 0, listFirst, 0, list.length / 2);
mergeSort(listFirst);
int second = list.length - list.length / 2;
E[] listSecond = (E[]) new Object[second];
System.arraycopy(list, list.length / 2, listSecond, 0, second);
mergeSort(listSecond);
E[] temp = merge(listFirst, listSecond);
System.arraycopy(temp, 0, list, 0, list.length);
}
}
经过修改后正确的代码应为
private static <E extends Comparable<E>> void mergeSort(E[] list){
if(list.length > 1){
E[] listFirst = (E[]) new Comparable[list.length / 2];
System.arraycopy(list, 0, listFirst, 0, list.length / 2);
mergeSort(listFirst);
int second = list.length - list.length / 2;
E[] listSecond = (E[]) new Comparable[second];
System.arraycopy(list, list.length / 2, listSecond, 0, second);
mergeSort(listSecond);
E[] temp = merge(listFirst, listSecond);
System.arraycopy(temp, 0, list, 0, list.length);
}
}
错误原因在于方法名前已经限定了泛型E的范围,E应为Comparable的子类,而Object不为Comparable的子类,因此在类型强转换时出错
E[] array= (E[]) new Object[length];
这个创建方法自然也是没有问题的,只不过在我方法中存在的特殊性导致了报错