我在尝试创建通用数组时得到了Cannot create a generic array of T
像这样
tmp = new T[n];
我找到了this 主题,但每次我想调用方法时必须通过类似乎对我来说很麻烦。
所以我以下一个方式解决了它
this.tmp=Arrays.copyOf(list, n);
考虑其余代码是否是好的解决方案?为什么是?为什么不呢?
完整代码:
public class MergeSort<T extends Comparable<? super T>>{
private T[] A;
private T[] tmp;
private int n;
public void sort(T[] list){
this.A=list;
this.n=list.length;
this.tmp=Arrays.copyOf(list, n);
mergeSort(0,n-1);
}
private void mergeSort(int low,int high){
if(low<high){
int middle=(low+high)/2;
mergeSort(low, middle);
mergeSort(middle+1, high);
merge(low,middle,high);
}
}
private void merge(int left,int right,int rightEnd){
int leftEnd=right,k=left;
right++;
while(left<=leftEnd && right<=rightEnd){
if(A[left].compareTo(A[right])<=0)
tmp[k++]=A[left++];
else
tmp[k++]=A[right++];
}
while(left<=leftEnd)
tmp[k++]=A[left++];
while(right<=rightEnd)
tmp[k++]=A[right++];
for (int i = 0; i <= rightEnd; i++) {
A[i] = tmp[i];
}
}
}
修改 也许更好的问题是;如果我使用下面的代码行呢?
this.tmp=(T[]) Arrays.copyOf(new Object[]{}, n)
答案 0 :(得分:2)
您可以在guava中使用此方法
static <T> T[] newArray(T[] reference, int length) {
Class<?> type = reference.getClass().getComponentType();
@SuppressWarnings("unchecked")
T[] result = (T[]) Array.newInstance(type, length);
return result;
}