public static void main(String[] args) {
// TODO Auto-generated method stub int []a ={3,4,5,32,6,345,432,8};
mergeSort(a);
}
public static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType []a){
AnyType [] tmpArray=(AnyType[])new Comparable[a.length];
mergeSort(a,tmpArray,0,a.length-1);
}谁能说说这里用的泛型怎么这么麻烦,为什么不用简单的T 定义呢 还有,已经用了泛型了,可是 调用mergeSort()是还是报错,就是
mergeSort(a);
这句,IDE报错说mergeSort()
The method mergeSort(AnyType[]) in the type MergeSort is not applicable for the arguments (int[])
麻烦知道的指点一下
Arrays.sort(a);
System.out.println(Arrays.toString(a));
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub int []a ={3,4,5,32,6,345,432,8};
mergeSort(a);
}
public static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType []a){
AnyType [] tmpArray=(AnyType[])new Comparable[a.length];
mergeSort(a,tmpArray,0,a.length-1);
} private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType [] a,AnyType [] tmpArray,int left,int right){
if(left<right){
int center=(left+right)/2;
mergeSort(a,tmpArray,left,center);
mergeSort(a,tmpArray,center+1,right);
merge(a,tmpArray,left,center+1,right);
}
}
private static <AnyType extends Comparable<? super AnyType>> void merge( AnyType [] a,AnyType [] tmpArray,int leftPos,int rightPos,int rightEnd){
int leftEnd =rightPos;
int tmpPos=leftPos;
int numElements =rightEnd=leftPos+1;
while(leftPos<=leftEnd && rightPos <=rightEnd){
if(a[leftPos].compareTo(a[rightPos])<=0)
tmpArray[tmpPos++]=a[leftPos++];
else tmpArray[tmpPos++]=a[rightPos++];
}
while(leftPos <= leftEnd) tmpArray[tmpPos++] =a[leftPos++];
while(rightPos<=rightEnd) tmpArray[tmpPos++] =a[rightPos++];
for(int i=0;i<numElements;i++,rightEnd --){
a[rightEnd]=tmpArray[rightEnd];
}
}
}
会报这个错误The method mergeSort(AnyType[]) in the type MergeSort is not applicable for the arguments (int[])
merge()中
//int leftEnd =rightPos;
int leftEnd =rightPos - 1;
int tmpPos = leftPos;
//int numElements =rightEnd=leftPos+1;
int numElements =rightEnd - leftPos+1;范型方法在调用的时候要使用包装的Integer[]数组,而不能使用基本类型int[],因为范型不识别基本类型,而编译器只可以从int到Integer自动包装,而不能把int[]自动包装为Integer[],所以使用int[]会产生编译错误,改为
Integer []a ={3,4,5,32,6,345,432,8};
后就不会产生编译错误。
至于范型的用法很怪异,是因为java中的范型中存在 擦除,类型的信息在运行时会丢失,所以必须用边界来在编译期确保传入的参数是符合一定的规则的。擦除是java范型中必须理解的概念,内容比较多,一下说不清,如果想搞清楚,还是找本书好好看看或者在网上搜一下。我正看的 Thinking in java 中就讲的比较详细。
谁能解释一下这个呢 不太懂啊