用Java创建泛型数组
在尝试创建泛型数组时,我发现用Java创建泛型数组,java,arrays,generics,Java,Arrays,Generics,在尝试创建泛型数组时,我发现无法创建T的泛型数组 像这样 tmp = new T[n]; 我发现 但每次我想调用这个方法时都要通过考试,这似乎给我带来了很多麻烦 所以我用下一种方法解决了它 this.tmp=Arrays.copyOf(list, n); 考虑到代码的其余部分,这是一个好的解决方案吗?为什么是?为什么不 完整代码: public class MergeSort<T extends Comparable<? super T>>{ private
无法创建T的泛型数组
像这样
tmp = new T[n];
我发现
但每次我想调用这个方法时都要通过考试,这似乎给我带来了很多麻烦
所以我用下一种方法解决了它
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];
}
}
}
你可以用番石榴的这种方法
static <T> T[] newArray(T[] reference, int length) {
Class<?> type = reference.getClass().getComponentType();
@SuppressWarnings("unchecked")
T[] result = (T[]) Array.newInstance(type, length);
return result;
}
static T[]newArray(T[]reference,int-length){
类类型=reference.getClass().getComponentType();
@抑制警告(“未选中”)
T[]结果=(T[])数组.newInstance(类型,长度);
返回结果;
}
您需要以合并排序方式复制源数组:)顺便说一句,您的合并排序已被破坏@Sleiman感谢您指出错误。至于复制,是的,在这里我需要复制数组,但这就是我开始考虑如何创建通用数组的地方。也许更好的问题是,是否像这样“this.tmp=(T[])Arrays.copyOf(newobject[]{},n);”在Java中,每个数组都有一个公共的clone()
方法。您只需编写this.tmp=list.clone()代码>。我将使用此方法,因为它似乎是一个更好的解决方案,但我不能将其标记为答案,谢谢。
static <T> T[] newArray(T[] reference, int length) {
Class<?> type = reference.getClass().getComponentType();
@SuppressWarnings("unchecked")
T[] result = (T[]) Array.newInstance(type, length);
return result;
}